大家好,我是 zeroing~
今天介绍一下如何用 Python 来爬取京东商品类目,数据包含商品标题、价格、出版社、作者等信息,
本次爬虫用到的核心库为 Selenium + pyquery ,Selenium 用于驱动浏览器对网页进行模拟访问,pyquery 用于解析页面信息做数据提取,先看一下最终效果
启动脚本之后,Selenium 自动打开页面京东网页端页面,对商品页信息进行翻页操作,在浏览器翻页的同时,控制后台返回提取到的数据,
在介绍主程序之前,这里先介绍 Selenium 程序包
Selenium 的安装
Selenium 主要作为 Web 应用程序的测试工具,能够操控浏览器完成一系列步骤,模拟人为操作;比如自动刷课
,自动填写文本
,网页端自动查询快递单号
都是没问题的,目前支持 Java、Python、C#、Ruby 等多种语言;
在做网页爬取时,有的网页的数据是以 Ajax 方式进行渲染,如微博,头条没有下一页入口通过刷新页面实现翻页效果;这类网页端数据并不是直接放在 html 中,是通过用户操作触发镶嵌在html 中的 js 命令,从而调用存放 json 文件中的数据,最终呈现;
对于这类网页采集时,一般有两种思路:
1,利用开发者工具,找到存放 json 数据隐藏链接,再用常规的 Request 方法对数据进行提取;
2,利用 Selenium 工具模拟人为操作,实现数据的抓取;
因此 Selenium 工具可以对于网页端的一些反爬措施能够达到一些有效的抑制;
Python 使用 Selenium 时可以借助封装好的 Selenium 库,安装时利用 pip 命令即可完成
pip install selenium
目前 Selenium 支持的浏览器包括 Chrome 和 Firefox ,这里建议大家选择 Chrome 会好一点,因为网上关于 Chrome 的文档相对会多一点,
但在使用之前,除了保证 Chrome 浏览器安装好之外,还需要确保 chromedriver.exe 工具( Selenium 的核心为 webdriver,而 chromedriver.exe 为 Chrome 的 WebDriver 工具)也安装好
chromedriver 的版本需要与 Chrome 浏览器的版本对应,下载到本地即可
下载地址如下:https://chromedriver.chromium.org/downloads
2,爬虫逻辑
用 Selenium 模拟人为操作对京东数据进行抓取,紧要依次进行以下几个步骤(这里以抓取 Python书籍 商品为例):
1,驱动浏览器,打开京东网站;
2,找到搜素框,清空并填入关键词Python书籍,再点击一下旁边的搜索按钮;
3,转到商品页对数据进行抓取,再驱动 Selenium 工具完成翻页操作,依次对全部数据进行抓取;
首先需要进行初始化,创建 webdriver 的 Chrome浏览器、数据的存储文件(这里我用的是 txt 文件)
def __init__(self,item_name,txt_path):
url = 'https://www.jd.com/' # 登录网址
self.url = url
self.item_name = item_name
self.txt_file = open(txt_path,encoding='utf-8',mode='w+')
options = webdriver.ChromeOptions() # 谷歌选项
# 设置为开发者模式,避免被识别
options.add_experimental_option('excludeSwitches',
['enable-automation'])
self.browser = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",
options = options)
self.wait = WebDriverWait(self.browser,2)
webdriver.Chrome() 方法用于创建一个驱动的浏览器 Chrome ,将之前下载到本地的 chromedriver.exe 文件夹路径赋给 executable_path 参数,
在浏览器打开网页时,可能由于网速出现加载慢的问题,因此这里用 WebDriverWait 方法来创建一个 wait 方法,每次调用时浏览器都需要等待 2 秒之后再进行下一步操作;
初始化操作之后,接下来就是主程序进行模拟访问、输入、点击等操作;我把这部分操作全部封装到一个 run() 函数中,
def run(self):
"""登陆接口"""
self.browser.get(self.url)
input_edit = self.browser.find_element(By.CSS_SELECTOR,'#key')
input_edit.clear()
input_edit.send_keys(self.item_name)
search_button = self.browser.find_element(By.CSS_SELECTOR,'#search > div > div.form > button')
search_button.click()# 点击
time.sleep(2)
html = self.browser.page_source # 获取 html
self.parse_html(html)
current_url = self.browser.current_url # 获取当前页面 url
initial_url = str(current_url).split('&pvid')[0]
for i in range(1,100):
try:
print('正在解析----------------{}图片'.format(str(i)))
next_page_url = initial_url + '&page={}&s={}&click=0'.format(str(i*2+1),str(i*60+1))
print(next_page_url)
self.browser.get(next_page_url)
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul > li')))
html = self.browser.page_source
self.parse_html(html)# 对 html 网址进行解析
time.sleep(2) # 设置频率
except Exception as e:
print('Error Next page',e)
self.txt_file.close()# 关闭 txt 文件
首先用 get() 方法访问京东主页面,再定位到页面中的搜索栏和搜索按钮标签 input_edit
、search_button
;完成输入,点击操作
关于网页元素标签定位,如果不会的话可借助于浏览器开发者模式,分为下面几步(这里以 CSS_Selector 为例):
1,点击开发者模式中左上角拾取元素按钮;
2,用鼠标点击你要选择的元素;
3,在 html 源码选中区域,鼠标右键选择 Copy
4,选中 Copy Selector 选项;
5,粘贴到粘贴板上即可;
在进行翻页操作时,这里根据 京东 url 规律来进行构造的,
第 5 页
https://search.jd.com/Search?keyword=%E4%BB%A3%E6%A3%AE%E9%93%B5&qrst=1&suggest=7.def.0.base&wq=%E4%BB%A3%E6%A3%AE%E9%93%B5&stock=1&page=9&s=241&click=0
第 6 页
https://search.jd.com/Search?keyword=%E4%BB%A3%E6%A3%AE%E9%93%B5&qrst=1&suggest=7.def.0.base&wq=%E4%BB%A3%E6%A3%AE%E9%93%B5&stock=1&page=11&s=301&click=0
仔细查看的话会发现,这里第 5 页和第 6 页 url 唯一不同的就是其中两个参数 page
和 s
;
page
之间相差2;s
之间相差 60;
根据这个规律,通过更改 page 和 s 参数来构建京东商品前100 页商品信息,来完成数据的抓取;
关于数据提取部分,我利用 parse_html
函数来完成
为了提高程序的友好性,我把全部功能封装到一个类中,使用者只需要输入两个参数,一个是用于需要采集的商品名称,另一个是存储文件路径;即可完成数据的爬取;
最终把爬取到的数据存入 txt 文件中,结果如下
4,总结
尽管 selenium 对于网页端的一些反爬机制实现有效地破解,但对于一些网站时没有用的,例如拉勾网,当你用 Selenium 驱动浏览器在拉钩官网模拟翻页操作时,网站能识别出非人为操作,对你的 IP 进行暂时性封禁并警告;
关于本篇文章涉及到的完整源码,关注微信公号:小张Python,后台回复关键字:京东商品 ,即可获取!
好了,以上就是本篇文章的全部内容了,最后感谢大家的阅读!