本文共 5464 字,大约阅读时间需要 18 分钟。
爬取某东商品信息,https://www.jd.com/。
实际上就是模拟人如何使用京东网页去搜索相应的商品,然后股东鼠标加载出所有的商品信息,然后同过网页解析得到想要的商品信息。 商品信息包含,商品名字、价格、销量、商品评价数、店铺名字,甚至商品链接。这也是做数据分析所需的,比如说,你拿到了信息之后,是不是可以通过数据分析,找到价格和销量的关系,比如说分析哪个价位的商品销量最好,那就可以去调整相应的店铺相应的不同价位商品的配置数量。然后当你得到一页商品信息之后,还需要翻页,进行第二页信息的抓取。
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC
使用css选择器,获取相应的标签的
def get_search(): driver.get('https://www.jd.com/') #输入内容,通过css选择器输入 input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#key")) ) #输入之后点击按钮提交 submit = WebDriverWait(driver, 12).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#search > div > div.form > button > i'))) input.send_keys('笔记本') submit.click() #翻页 driver.implicitly_wait(10) # 浏览器的隐式等待(弹性等待)-->死等 driver.maximize_window() # 最大化浏览器 drop_down()#加上翻页
#懒加载,滚动鼠标才会加载数据;模拟滚动鼠标def drop_down(): '''模拟滚动鼠标加载数据''' for i in range(1,20,5): time.sleep(0.5) j = i / 20 #这一行是js代码,获取滚动条的长度 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js)
以商品价格为例,价格信息是在class = "p-price"类的<strong标签中的<i标签中。
def get_products(): '''解析商品信息''' lis = driver.find_elements_by_css_selector('.gl-item') for li in lis: try: product = { 'name': li.find_element_by_css_selector('div.p-name a em').text , # 商品名字 #'image': li.find_element_by_css_selector('div.p-img a').text, 'price': li.find_element_by_css_selector('div.p-price strong i').text + '元' , # 商品名字 'deal': li.find_element_by_css_selector('div.p-commit strong a').text, 'title': li.find_element_by_css_selector('span.J_im_icon a').text, #'location': item.find('.location').text(), } print(product) except Exception as er: print(er)
找到下一页,点击即可。
def next_page(): '''找到下一页的标签,点击''' driver.find_element_by_css_selector('#J_bottomPage > span.p-num > a.pn-next > em').click() driver.implicitly_wait(20)
def main(): get_search() for i in range(2): #爬取多少页 get_products() next_page() drop_down()if __name__ == '__main__': main()
爬取结果:
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC'''平时怎么使用浏览器,代码逻辑就怎么写'''driver = webdriver.Chrome()wait = WebDriverWait(driver, 10)def get_search(): driver.get('https://www.jd.com/') #输入内容,通过css选择器输入 input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#key")) ) #输入之后点击按钮提交 submit = WebDriverWait(driver, 12).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#search > div > div.form > button > i'))) input.send_keys('笔记本') submit.click() #翻页 driver.implicitly_wait(10) # 浏览器的隐式等待(弹性等待)-->死等 driver.maximize_window() # 最大化浏览器 drop_down()def get_products(): '''解析商品信息''' lis = driver.find_elements_by_css_selector('.gl-item') for li in lis: try: product = { 'name': li.find_element_by_css_selector('div.p-name a em').text , # 商品名字 #'image': li.find_element_by_css_selector('div.p-img a').text, 'price': li.find_element_by_css_selector('div.p-price strong i').text + '元' , # 商品名字 'deal': li.find_element_by_css_selector('div.p-commit strong a').text, 'title': li.find_element_by_css_selector('span.J_im_icon a').text, #'location': item.find('.location').text(), } print(product) except Exception as er: print(er)#懒加载,滚动鼠标才会加载数据;模拟滚动鼠标def drop_down(): '''模拟滚动鼠标加载数据''' for i in range(1,20,5): time.sleep(0.5) j = i / 20 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js)#这个函数爬取信息之后可以将数据保存为csv文件,使用的时候记得,import csvdef parse_product(): '''解析商品信息''' lis = driver.find_elements_by_css_selector('.gl-item') for li in lis: try: name = li.find_element_by_css_selector('div.p-name a em').text #商品名字 price = li.find_element_by_css_selector('div.p-price strong i').text + '元' # 商品名字 deal = li.find_element_by_css_selector('div.p-commit strong a').text # title = li.find_element_by_css_selector('span.J_im_icon a').text #店铺名字 print(name,price,deal,title) #print(name,price,deal) #with open('data.csv',mode='a',encoding='utf-8',newline='') as f: # csv_write =csv.writer(f) # csv_write.writerow(name,price,deal,title) except Exception as e: print(e)def next_page(): '''找到下一页的标签,点击''' driver.find_element_by_css_selector('#J_bottomPage > span.p-num > a.pn-next > em').click() driver.implicitly_wait(20)def main(): get_search() for i in range(2): #爬取多少页 get_products() next_page() drop_down()if __name__ == '__main__': main()
转载地址:http://iqoxi.baihongyu.com/