Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息
学习目的:
selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的
正式步骤
需求背景:抓取淘宝美食
Step1:流程分析
- 搜索关键字:利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
- 分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表
- 分析提取商品内容:利用PyQuery分析源码,解析得到商品列表
- 存储至MongoDB:将商品列表信息存储到数据库MongoDB
Step2:代码分析
chromedriver 下载:http://chromedriver.storage.googleapis.com/index.html
# -*- coding:utf-8 -*- import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException import time from pyquery import PyQuery as pq from config_taobao import * import pymongo ###数据库设置### client = pymongo.MongoClient(MONGO_URL) #client后的数据库用[] db = client[MONGO_DB] #公共参数 driver = webdriver.Chrome() url = 'https://www.taobao.com' wait = WebDriverWait(driver, 10) def search(): driver.get(url) #显式等待参考了官方api文档 http://selenium-python.readthedocs.io/waits.html searchbox = wait.until(EC.presence_of_element_located((By.ID, "q"))) submit = driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button') #下面是测试代码,验证提交按钮是否可用 submit1 = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="J_TSearchForm"]/div[1]/button'))) # print(submit1.text) #搜索关键字可以设置为用户收入,在公共参数表用Python的input函数 searchbox.send_keys('美食') submit.click() #等待页面加载出搜索结果的总页数 total = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@class="total"]'))) #页码加载完成后,获取商品信息 get_products() return total.text def next_page(page_number): try: input = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="mainsrp-pager"]/div/div/div/div[2]/input'))) submit = driver.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')#wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))) input.clear() input.send_keys(page_number) #此处设置等待时间是因为我本地的网速过快,不休眠一下,无法正常点击 time.sleep(3) submit.click() time.sleep(3) #验证输入页页码和高亮页是否匹配 wait.until( EC.text_to_be_present_in_element( (By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number) ) ) get_products() #下面的异常抓取是函数递归,点击确定按钮失败后,重新加载此函数 except TimeoutException: next_page(page_number) def get_products(): #pyquery的用法,我也不是很了解,后续加强学习,现在知道这么用 wait.until( EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')) ) html = driver.page_source doc = pq(html) items = doc('#mainsrp-itemlist .items .item').items() for item in items: product = { 'image':item.find('.pic .img').attr('src'), 'price':item.find('.price').text().strip()[3:], 'name':item.find('.title').text(), 'shopname':item.find('.shop').text() } print(product) save_product_info(product) ##保存信息至MongoDB def save_product_info(result): if db[MONGO_Table].insert(result): print('存储成功') def main(): total = search() total = int(re.compile('(\d+)').search(total).group(1)) print(total) for i in range(2,total+1): next_page(i) if __name__ == '__main__': main()
配置文件信息:
# -*- coding:utf-8 -*- MONGO_URL = 'localhost' MONGO_DB = 'taobao' MONGO_Table = 'product'
学习总结:
爬虫越来越好玩了,继续学