实现流程
1.搜索关键字:利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表
2.剖析页码并翻页:得到商品页码数,仿照翻页,得到后续页面的商品列表
3.剖析提取商品内容:利用PyQuery剖析源码,解析得到商品列表
4.存储至MongoDB:将商品列表信息存储到数据库MongoDB
详细实现
1.首先须要声明一个browser用来操作,我的是chrome。这里的wait是在后面的判断元素是否涌现时利用,第二个参数为等待最永劫光,超过该值则抛出非常
#创建一个浏览器工具browser = webdriver.Chrome()#十秒内探求元素失落败,将报出TimeoutException非常wait = WebDriverWait(browser, 10)
2.声明好之后就须要进行打开网页、进行搜索的操作
def search(): \"大众\公众\"大众 浸染:通过关键字搜索得到搜索内容第一页产品信息,并返回搜索内容共计页码 \"大众\"大众\"大众 print('正在搜索') try: browser.get('https://www.taobao.com') print(browser.page_source) # 获取input输入框工具 input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, \"大众#q\"大众)) )# # 获取button提交工具 submit = wait.until( EC.element_to_be_clickable( (By.CSS_SELECTOR, \"大众#J_TSearchForm > div.search-button > button\公众) ) ) # KEYWORD是config.py文件中定义的搜索关键字,可修正 input.send_keys(KEYWORD) # 点击button提交按钮 submit.click() # 通过CSS_SELECTOR选择器获取total页码 total_page = wait.until( EC.presence_of_element_located( (By.CSS_SELECTOR, \公众#mainsrp-pager > div > div > div > div.total\"大众) ) ) # 解析页面内容,并将数据保存至MongoDB中 get_products() return total_page.text except TimeoutException: # 涌现超时访问就重新调用一次search return search()
3.第一个页面操作之后,我们须要进行翻页操作,如下:
def next_page(page_number): \"大众\"大众\公众 浸染:作人为翻页功能,并得到该页产品信息 page_number:循环的页码,将页码写入input框中 \"大众\"大众\"大众 print('正在翻页', page_number) try: # 获取input输入框工具 input = wait.until( EC.presence_of_element_located( (By.CSS_SELECTOR, \公众#mainsrp-pager > div > div > div > div.form > input\"大众) ) ) # 获取button提交工具 submit = wait.until( EC.element_to_be_clickable( (By.CSS_SELECTOR, \"大众div > div > div > div.form > span.btn.J_Submit\"大众) ) ) # 将input框清空 input.clear() # 向input框中输入页码 input.send_keys(page_number) # 点击button提交按钮 submit.click() wait.until( # 验证输入框内的页码是否为当前高亮页码,如果是,则连续实行 # text参数是否在该span元素内,此处须要把稳text的参数位置 EC.text_to_be_present_in_element( (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number) ) ) # 获取产品信息并保存至MongoDB get_products() except TimeoutException: # 超时非常,则连续解析该页 next_page(page_number)
4.写完搜索操作和翻页操作后,我们须要完成对每个页面的商品信息获取功能
def get_products(): \"大众\"大众\"大众 浸染:通过页面源代码,将产品信息保存至MongoDB中 \"大众\"大众\公众 # 通过CSS_SELECTOR选择器,验证页面中是否存在产品工具 wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, \"大众#mainsrp-itemlist .items .item\"大众)) ) # 拿到页面源码 html = browser.page_source # 通过pyquery找到产品工具 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(), 'deal': item.find('.deal-cnt').text()[:-3], 'title': item.find('.title').text(), 'shop': item.find('.shop').text(), 'location': item.find('.location').text() } # print(product) # 将组建好的每个产品信息保存至MongoDB save_to_mongo(product)
5.获取信息之后则须要对信息进行存储,将数据库关键参数定义在config.py文件中
#!/usr/bin/env python# coding=utf-8# 本地的数据库MONGO_URL = 'localhost'# 数据库的名称MONGO_DB = 'taobao'# 数据库的表名MONGO_TABLE = 'products'
6.将组建好的每个产品信息保存至MongoDB
# 创建一个MongoDB工具client = pymongo.MongoClient(MONGO_URL)# 创建一个数据库,把稳是[]而不是()db = client[MONGO_DB]def save_to_mongo(result): \"大众\公众\"大众 浸染:将信息保存至MongoDB中 \"大众\"大众\公众 try: if db[MONGO_TABLE].insert(result): print('Successfully save to MongoDB', result) except Exception: print('Failed save to MongoDB', result)
7.爬取调度器
def TbMeishi_Spider(): \公众\"大众\公众 浸染:淘宝美食爬取调度器 \公众\"大众\公众 try: total_page = search() # 通过正则将search返回的total页码内容解析成数字形式 pattern = re.compile('(\d+)') total_page = int(pattern.search(total_page).group(1)) # print(total_page) # 遍历页码,传入next_page函数中,做整站爬取 for i in range(2, total_page + 1): next_page(i) except Exception: print('有缺点产生...') finally: browser.close()
8.代码完成到这里已经可以结束了,但是利用Selenium仿照会创造每次运行程序都会打开一个浏览器,然后自动操作,可以最直接地不雅观察到代码的运行,但是如果不想弹出浏览器的话,可以利用PhantomJS来实现一个无界面的webkit浏览器。虽然没有界面,但dom渲染、js运行、网络访问、canvas/svg绘制等功能都很完备,在页面抓取、页面输出、自动化测试等方面有广泛的运用。下载PhantomJS地址:http://phantomjs.org/download.html,下载完成后解压缩,将PhantomJS添加到环境变量中即可
在config.py文件中加上
# 关闭load-images的功能,加快运行速率,默认开启,开启disk-cache缓存,默认关闭SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']# 无界面浏览器,将browser改为browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)# 设置PlantomJS的窗口大小,可能会影响内容下载browser.set_window_size(1400, 900)
总结思考
1.目标网址不匹配
一开始利用显示等待访问,通过CSS_SELECTOR的id选择器找到网页元素,可末了程序都实行非常,每次都是TimeoutExceptions的非常缺点。经由反复排查,才创造淘宝网有很多个站点
我在程序中利用的是:http://www.taobao.com
但是在进行网页剖析的时候随意用百度搜了一个淘宝站点,它的站点是:https://uland.taobao.com/sem/tbsearch
两个站点地址不一样,网页元素也不一样,自己竟然会犯这种缺点,应牢记,精确的选择元素该当是下面这几行
from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECinput = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.ID, 'q')))button = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
2.text参数是否在该span元素内,此处须要把稳text的参数位置
# 验证text参数是否与选择器选择的元素文本内容同等text_to_be_present_in_element(locator, text_)
3.完全源码地址:https://github.com/XiaoFei-97/TbMeishi_Spider\