php抓取网页数据实例(本节讲解PythonSelenium爬虫爬虫实战案例,通过对实战讲解)

优采云 发布时间: 2022-01-19 18:04

  php抓取网页数据实例(本节讲解PythonSelenium爬虫爬虫实战案例,通过对实战讲解)

  本节讲解Python Selenium爬虫的实际案例。通过实际案例的讲解,可以进一步了解 Selenium 框架。

  实战案例目标:抓取京东商城()的商品名称、商品价格、评论数、店铺名称。例如,如果您输入搜索“Python 书籍”,则会捕获以下数据:

  

{'name': 'Python编程 从入门到实践 第2版 人民邮电出版社', 'price': '¥52.50', 'count': '200+条评价', 'shop': '智囊图书专营店'}

{'name': 'Python编程 从入门到实践 第2版(图灵出品)', 'price': '¥62.10', 'count': '20万+条评价', 'shop': '人民邮电出版社'}

...

  Selenium 框架的学习重点是定位元素节点。我们介绍了 8 种定位方法,其中 Xpath 表达式适用性强,方便快捷。因此,建议您熟悉 Xpath 表达式的相关语法规则。本节的大部分案例都是使用Xpath表达式来定位元素,希望能帮助你更新知识。

  本节案例涉及几个技术难点:一是如何下拉滚动条下载产品;二、如何翻页,即抓取下一页的内容;第三,如何判断数据是否被抓取,即结束页面。下面我们一步一步解释。

  实现自动搜索 最基本的一步就是实现自动输出和自动搜索。先定位输入框节点,再定位搜索按钮节点。这与实现百度自动搜索的思路是一致的。最重要的是正确定位元素节点。

  通过开发者调试工具查看对应位置,可以得到如下Xpath表达式:

  

输入框表达式://*[@id="key"]

搜索按钮表达式://*[@class='form']/button

  代码如下所示:

  

from selenium import webdriver

broswer=webdriver.Chrome()

broswer.get('https://www.jd.com/')

broswer.find_element_by_xpath('//*[@id="key"]').send_keys("python书籍")

broswer.find_element_by_xpath("//*[@class='form']/button").click()

  滚动滑块实现自动搜索后,下一步就是抓取页面上的商品信息,你会发现只有当滑块滚动到底部时,商品才会满载。滚轮操作的代码如下:

  

# scrollTo(xpos,ypos)

# execute_script()执行js语句,拉动进度条件

#scrollHeight属性,表示可滚动内容的高度

self.browser.execute_script(

'window.scrollTo(0,document.body.scrollHeight)'#拉动进度条至底部

)

  之后,通过Xpath表达式匹配所有产品,放入一个大列表中,通过循环列表取出每个产品,最后提取出想要的信息。

  

li_list=self.browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li')

for li in li_list:

item={}

# 提取商品名

item['name']=li.find_element_by_xpath('.//div[@class="p-name"]/a/em').text.strip()

# 提取价格

item['price']=li.find_element_by_xpath('.//div[@class="p-price"]').text.strip()

# 提取评论数量

item['count']=li.find_element_by_xpath('.//div[@class="p-commit"]/strong').text.strip()

# 提取商家店铺

item['shop']=li.find_element_by_xpath('.//div[@class="p-shopnum"]').text.strip()

  如何实现翻页取数据,判断数据已经取到?这其实不难想到,我们可以跳转到最后一页(即最后一页)。此时最后一页的“下一页”不可用,其元素节点如下:

  

终止页下一页class属性:<a class="pn-next disabled">下一页 > </a>

其他页下一页class属性:<a class="pn-next" onclick="SEARCH.page(3, true)" ...>下一页 > </a>

  如果页面源代码中存在上述代码,则证明本页是最后一页,如果不存在,则不是。因此,上述要求可以通过if ... else语句来实现,如下:

  

#-1说明没找到,不是最后一页,执行点击 “下一页” 操作

if self.browser.page_source.find(&#39;pn-next disabled&#39;)==-1:

browser.find_element_by_class_name(&#39;pn-next&#39;).click()

  完整的程序代码完整的程序代码如下:

  

#coding:utf8

from selenium import webdriver

import time

import pymongo

class JdSpider(object):

def __init__(self):

self.url=&#39;http://www.jd.com/&#39;

self.options=webdriver.ChromeOptions() # 无头模式

self.options.add_argument(&#39;--headless&#39;)

self.browser=webdriver.Chrome(options=self.options) # 创建无界面参数的浏览器对象

self.i=0 #计数,一共有多少件商品

#输入地址+输入商品+点击按钮,切记这里元素节点是京东首页的输入栏、搜索按钮

def get_html(self):

self.browser.get(self.url)

self.browser.find_element_by_xpath(&#39;//*[@id="key"]&#39;).send_keys(&#39;python书籍&#39;)

self.browser.find_element_by_xpath("//*[@class=&#39;form&#39;]/button").click()

#把进度条件拉倒最底部+提取商品信息

def get_data(self):

# 执行js语句,拉动进度条件

self.browser.execute_script(

&#39;window.scrollTo(0,document.body.scrollHeight)&#39;

)

# 给页面元素加载时预留时间

time.sleep(2)

#用 xpath 提取每页中所有商品,最终形成一个大列表

li_list=self.browser.find_elements_by_xpath(&#39;//*[@id="J_goodsList"]/ul/li&#39;)

for li in li_list:

#构建空字典

item={}

item[&#39;name&#39;]=li.find_element_by_xpath(&#39;.//div[@class="p-name"]/a/em&#39;).text.strip()

item[&#39;price&#39;]=li.find_element_by_xpath(&#39;.//div[@class="p-price"]&#39;).text.strip()

item[&#39;count&#39;]=li.find_element_by_xpath(&#39;.//div[@class="p-commit"]/strong&#39;).text.strip()

item[&#39;shop&#39;]=li.find_element_by_xpath(&#39;.//div[@class="p-shopnum"]&#39;).text.strip()

print(item)

self.i+=1

def run(self):

#搜索出想要抓取商品的页面

self.get_html()

#循环执行点击“下一页”操作

while True:

#获取每一页要抓取的数据

self.get_data()

#判断是否是最一页

if self.browser.page_source.find(&#39;pn-next disabled&#39;)==-1:

self.browser.find_element_by_class_name(&#39;pn-next&#39;).click()

#预留元素加载时间

time.sleep(1)

else:

print(&#39;数量&#39;,self.i)

break

if __name__ == &#39;__main__&#39;:

spider=JdSpider()

spider.run()

  输出如下:

  

{&#39;name&#39;: &#39;Python编程 从入门到实践 第2版(图灵出品) 人民邮电出版社&#39;, &#39;price&#39;: &#39;¥52.50&#39;, &#39;count&#39;: &#39;200+条评价&#39;, &#39;shop&#39;: &#39;智囊图书专营店&#39;}

{&#39;name&#39;: &#39;Python编程 从入门到实践 第2版(图灵出品)&#39;, &#39;price&#39;: &#39;¥62.10&#39;, &#39;count&#39;: &#39;20万+条评价&#39;, &#39;shop&#39;: &#39;人民邮电出版社&#39;}

{&#39;name&#39;: &#39;Python编程三剑客:Python编程从入门到实践第2版+快速上手第2版+极客编程(套装共3册)&#39;, &#39;price&#39;: &#39;¥206.90&#39;, &#39;count&#39;: &#39;5万+条评价&#39;, &#39;shop&#39;: &#39;人民邮电出版社&#39;}

{&#39;name&#39;: &#39;Python数据分析从入门到实践(excel高效办公)(3全彩版)&#39;, &#39;price&#39;: &#39;¥46.10&#39;, &#39;count&#39;: &#39;10万+条评价&#39;, &#39;shop&#39;: &#39;明日科技京东自营旗舰店&#39;}

{&#39;name&#39;: &#39;零基础学Python(编程入门 项目实践 同步视频)(3全彩版)&#39;, &#39;price&#39;: &#39;¥37.50&#39;, &#39;count&#39;: &#39;10万+条评价&#39;, &#39;shop&#39;: &#39;明日科技京东自营旗舰店&#39;}

{&#39;name&#39;: &#39;Python编程快速上手 让繁琐工作自动化 第2版&#39;, &#39;price&#39;: &#39;¥44.50&#39;, &#39;count&#39;: &#39;10万+条评价&#39;, &#39;shop&#39;: &#39;人民邮电出版社&#39;}

{&#39;name&#39;: &#39;*敏*感*词*包邮Python学习手册(原书第5版)上下册2本/计算机编程设计|8053406&#39;, &#39;price&#39;: &#39;¥142.30&#39;, &#39;count&#39;: &#39;100+条评价&#39;, &#39;shop&#39;: &#39;互动创新图书专营店&#39;}

{&#39;name&#39;: &#39;零基础入门学习Python(第2版)&#39;, &#39;price&#39;: &#39;¥70.30&#39;, &#39;count&#39;: &#39;1万+条评价&#39;, &#39;shop&#39;: &#39;清华大学出版社&#39;}

{&#39;name&#39;: &#39;超简单:用Python让Excel飞起来&#39;, &#39;price&#39;: &#39;¥34.90&#39;, &#39;count&#39;: &#39;2万+条评价&#39;, &#39;shop&#39;: &#39;机械工业出版社自营官方旗舰店&#39;}

{&#39;name&#39;: &#39;流畅的Python(图灵出品)&#39;, &#39;price&#39;: &#39;¥109.80&#39;, &#39;count&#39;: &#39;2万+条评价&#39;, &#39;shop&#39;: &#39;人民邮电出版社&#39;}

{&#39;name&#39;: &#39;Python编程从入门到实践第二版 python编程从入门到实战零基础自学教程计算机基础语言数据分析&#39;, &#39;price&#39;: &#39;¥49.80&#39;, &#39;count&#39;: &#39;5000+条评价&#39;, &#39;shop&#39;: &#39;墨马图书旗舰店&#39;}

{&#39;name&#39;: &#39;Python深度学习:基于PyTorch&#39;, &#39;price&#39;: &#39;¥73.40&#39;, &#39;count&#39;: &#39;5万+条评价&#39;, &#39;shop&#39;: &#39;机械工业出版社自营官方旗舰店&#39;}

{&#39;name&#39;: &#39;Python自然语言处理实战:核心技术与算法 自然语言处理教程&#39;, &#39;price&#39;: &#39;¥48.30&#39;, &#39;count&#39;: &#39;37条评价&#39;, &#39;shop&#39;: &#39;芝麻开门图书专营店&#39;}

{&#39;name&#39;: &#39;Effective Python:编写高质量Python代码的90个有效方法(原书第2版)&#39;, &#39;price&#39;: &#39;¥110.60\n¥105.10&#39;, &#39;count&#39;: &#39;2万+条评价&#39;, &#39;shop&#39;: &#39;机械工业出版社自营官方旗舰店&#39;}

...

  Selenium 自动爬虫让你不用关心 网站 的类型(静态或动态),只要一步步搜索元素节点并点击,即可实现数据抓取。但是 Selenium 最大的缺点就是效率低,所以只适合小规模数据采集的工作。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线