一、前言
本编教程是通过selenium爬取阿里巴巴采购批发网址的商品数据信息,并保存到mongo。为什么用selenium呢,是因为网站大多数不再是静态网站,而是有诸如Ajax请求的动态网站,如果接口好分析是个静态接口,那么还是用不着selenium,但是像淘宝这类的网站我们不好分析它的接口,因为接口是动态变化的。
github:https://github.com/FanShuixing/git_webspider/commit/e939ab29dd531384955050f9bef8615b1022c7ff
二、学习资料(感谢分享)
Ajax:[Python3网络爬虫开发实战] 6-Ajax数据爬取
selenium: Python3网络爬虫开发实战] 7-动态渲染页面爬取
pyquery: [Python3网络爬虫开发实战] 4.3-使用pyquery
MongoDB:[Python3网络爬虫开发实战] 5.3.1-MongoDB存储
三、开始爬取
1、先分析目标网址,为什么选择selenium
在搜索中输入女装,用F12查看源码,看看网页显示的内容是不是Ajax。点击Network,选择下面的XHR,按F5刷新页面,下滑浏览器商品页面
只有两个Ajax请求,而且Preview里面并没有代码。瞬间感觉天上掉馅饼了,难道是静态网页没有其他数据请求吗?如果是这样直接弄个pyquery解析网页就是了
然而事实并不是这样,下滑的时候都能感觉到,静态网页是一次性请求完毕,而这个下滑的时候,明显有新的数据请求,于是再看了一下JS中,果然有数据
如果只是用单纯的requests.get()是得不到异步请求的数据
2、selenium自动化测试,可见即可爬
from selenium import webdriver
browser=webdriver.Chrome()
def crawle():
url='https://www.1688.com/'
browser.get(url=url)
crawle()
运行后就产生了上图,这个弹出来的框我们要叉掉,可以选择点击“访问1688首页”。为了定位“访问1688首页”这个元素,右键检查,可查看元素
from selenium import webdriver
browser=webdriver.Chrome()
def crawle():
url='https://www.1688.com/'
browser.get(url=url)
button=browser.find_element_by_class_name('identity-cancel')
button.click()
crawle()
可以发现上图的框没见了(selenium中元素的定位很重要,有很多,开篇学习资料selenium中有详细讲解)
接下来需要在搜索框中输入我们想查询的数据,如女装,然后点击搜索。我们需要做的就是
1、定位搜素框
2、向搜素框中传入数据
3、定位搜素按钮,并点击
from selenium import webdriver
browser=webdriver.Chrome()
def crawle():
url='https://www.1688.com/'
browser.get(url=url)
#叉掉首页弹出大框
button=browser.find_element_by_class_name('identity-cancel')
button.click()
#定位搜索框
input=browser.find_element_by_id('alisearch-keywords')
input.send_keys('女装')
#定位搜索按钮
sea_button=browser.find_element_by_id('alisearch-submit')
sea_button.click()
crawle()
运行后会跳转页面,如下图,新的页面中又有框图,继续叉掉它
button_1=browser.find_element_by_class_name('s-overlay-close-l')
button_1.click()
接下来我想按照成交量排序,所以定位到成交量,并单击这个元素
#定位成交量
button_deal=browser.find_elements_by_css_selector('.sm-widget-sort.fd-clr.s-widget-sortfilt li')[1]
button_deal.click()
第一个函数:
from selenium import webdriver
browser=webdriver.Chrome()
def crawle():
url='https://www.1688.com/'
browser.get(url=url)
#叉掉首页弹出大框
button=browser.find_element_by_class_name('identity-cancel')
button.click()
#定位搜索框
input=browser.find_element_by_id('alisearch-keywords')
input.send_keys('女装')
#定位搜索按钮
sea_button=browser.find_element_by_id('alisearch-submit')
sea_button.click()
#叉掉框图
button_1=browser.find_element_by_class_name('s-overlay-close-l')
button_1.click()
#定位成交量
button_deal=browser.find_elements_by_css_selector('.sm-widget-sort.fd-clr.s-widget-sortfilt li')[1]
button_deal.click()
crawle()
3、页面如愿以偿地出来了,接下来就该抓取网页的元素了
在crawl()最后一行调用函数get_products()
接下来就在get_products()里面利用pyquery分析网页,抓取网页元素
可以发现每一个商品信息都在ul下面的li中,我们需要定位到li,然后循环访问每一个li元素。下面主要抓取产品名称title,产品销量deal,产品价格price,产品网址url
from selenium import webdriver
browser=webdriver.Chrome()
def crawle():
url='https://www.1688.com/'
browser.get(url=url)
#叉掉首页弹出大框
button=browser.find_element_by_class_name('identity-cancel')
button.click()
#定位搜索框
input=browser.find_element_by_id('alisearch-keywords')
input.send_keys('女装')
#定位搜索按钮
sea_button=browser.find_element_by_id('alisearch-submit')
sea_button.click()
#叉掉框图
button_1=browser.find_element_by_class_name('s-overlay-close-l')
button_1.click()
#定位成交量
button_deal=browser.find_elements_by_css_selector('.sm-widget-sort.fd-clr.s-widget-sortfilt li')[1]
button_deal.click()
get_products()
from pyquery import PyQuery as pq
from bs4 import BeautifulSoup
def get_products():
html=browser.page_source
doc=pq(html)
items=doc('.sm-offer .fd-clr .sm-offer-item').items()
index=0
for item in items:
index+=1
print('*'*50)
title=item.find('.s-widget-offershopwindowtitle').text().split('\n')
title=' '.join(title)
price_a=item.find('.s-widget-offershopwindowprice'