java爬虫抓取网页数据(一下如何用Python来爬取京东商品?逻辑用Selenium模拟人为操作)
优采云 发布时间: 2021-09-09 22:03java爬虫抓取网页数据(一下如何用Python来爬取京东商品?逻辑用Selenium模拟人为操作)
大家好,我在调零~
今天,我将介绍如何使用Python抓取京东产品类别。数据包括产品名称、价格、出版商、作者等信息,
这个爬虫使用的核心库是Selenium + pyquery。 Selenium用于驱动浏览器模拟访问网页,pyquery用于解析页面信息进行数据提取。来看看最终的结果吧。
启动脚本后,Selenium会自动打开京东网页,翻商品页面的页面信息,在浏览器翻页的同时控制后台返回提取的数据。
在介绍主程序之前,先在这里介绍一下Selenium包。
硒安装
Selenium 主要用作 Web 应用程序的测试工具。可以控制浏览器完成一系列步骤,模拟人的操作;比如类的自动刷新、文本的自动填充、web端的快递单号自动查询都可以,目前支持Java、Python、C#、Ruby等语言;
在做网页爬取时,部分网页的数据以ajax方式渲染,如微博,标题无下一页入口,通过刷新页面实现翻页效果;这种类型的网页数据不是直接放在html中,通过用户操作触发嵌入到html中的js命令,从而调用json文件中存储的数据,最后渲染;
对于采集这种类型的网页,一般有两种思路:
因此Selenium工具可以对web端的一些反爬措施实现一些有效的抑制;
Python 使用 Selenium 时,可以使用打包好的 Selenium 库,使用 pip 命令即可完成安装。
pip install selenium
Selenium 目前支持的浏览器包括 Chrome 和 Firefox。建议大家选择Chrome比较好,因为网上关于Chrome的文档会比较多。
但是在使用之前,除了确保安装了Chrome浏览器之外,还需要确保chromedriver.exe工具(Selenium的核心是webdriver,chromedriver.exe是Chrome的WebDriver工具)也安装了
chromedriver的版本需要和Chrome浏览器的版本相对应,本地可以下载
下载地址如下:/downloads
2、爬虫逻辑
使用Selenium模拟人工操作抓取京东数据,需要按顺序执行以下步骤(这里以抓取Python图书产品为例):
首先需要初始化,创建一个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为例):
在进行翻页操作时,这里是按照京东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和s参数来构建京东商品的前100页商品信息,完成数据抓取;
关于数据提取部分,我使用parse_html函数来完成
为了提高程序的友好性,我把所有的功能都封装在一个类中。用户只需要输入两个参数,一个是需要采集的产品名称,一个是存储文件路径;完成数据爬取;
最后将抓取到的数据保存成txt文件,结果如下
4、总结
selenium虽然可以有效破解web端的一些反爬虫机制,但是对于一些网站,比如拉勾,就没什么用了。在拉勾官网使用Selenium驱动浏览器模拟翻页操作时,网站可以识别非人为操作,暂时封禁并警告您的IP;
关于本文文章完整源码,获取方式: