java爬虫抓取动态网页( 动态网页爬虫技术一之API请求法安装selenium模块下载(组图))
优采云 发布时间: 2021-12-25 02:04java爬虫抓取动态网页(
动态网页爬虫技术一之API请求法安装selenium模块下载(组图))
在本次讲座中,我将解释一个稍微复杂一些的爬虫,即动态网页的爬虫。
动态网页技术介绍
动态网络爬虫技术一API请求方式
动态网络爬虫技术二模拟浏览器方法
安装 selenium 模块下载
谷歌浏览器驱动安装
ChromeDriver以某宝的松鼠店为例,抓取“坚果炒货”的产品名称、价格、销量和评论数
课后作业
关于作者
动态网页技术介绍
所谓动态网页,是指一种与静态网页相对的网页编程技术。对于静态网页,随着html代码的生成,页面的内容和显示效果基本不会发生变化——除非你修改页面代码。这不是动态网页的情况。虽然页面代码没有改变,但显示的内容会随着时间、环境或数据库操作的结果而改变。
值得强调的是,不要将动态网页与页面内容是否动态混淆。这里所说的动态网页与网页上的各种*敏*感*词*、滚动字幕等视觉动态效果无关。动态网页也可以是纯文本内容,也可以收录各种*敏*感*词*内容。这些只是网页的细节。内容的呈现形式,无论网页是否有动态效果,只要是使用动态网站技术生成的网页,都可以称为动态网页。(解释来源:百度百科-“动态网页”,如果链接失败请访问:%E5%8A%A8%E6%80%81%E7%BD%91%E9%A1%B5/6327050?fr=aladdin )
互联网每天都在蓬勃发展。数以万计的网络平台如雨后春笋般涌现。不同的平台有不同的权限和偏好,不同的用户可以推出不同的个性化内容。传统的静态网页似乎早已无法满足社会的需求。于是,动态网页技术应运而生。当然,在对网页加载速度要求越来越高的今天,异步加载已经成为很多大型网站的首选。比如各大电商平台、知识型网站、社交平台等,都广泛采用了异步加载的动态技术。简单的说就是一些随着时间和要求而变化的内容,比如某宝的商品价格、评论、
对于这种类型的动态页面,如果我们使用前面提到的静态网页的爬虫方法,可能得不到任何结果,因为异步加载的内容所在的位置多是请求内容的一段JS代码。在一定的触发操作下,这些JS代码开始工作,从数据库中提取出相应的数据,放置在网页框架中的相应位置,从而最终拼接成一个我们可以看到的完整页面。
动态网络爬虫技术一API请求方式
看似比较复杂的操作,看似给我们的爬虫带来了很大的麻烦,但实际上它们也可能给我们带来很大的便利。我们只需要找到JS请求的API,并按照一定的要求发送带有有效参数的请求就可以得到最干净的数据,而不是像以前那样从嵌套的HTML代码中慢慢解析我们想要的。所需数据。
这里我们以上面提到的豆瓣电影(如果链接失败,请访问:#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0)为例制作一个分析,提取豆瓣前100部电影的名字和评分以及它们的地址。
这是近期热门电影按人气排序的截图。每个月都有不同的新电影上映。每部电影每天都会以口碑效应呈现不同的人气排名。如果这个页面是静态网页,那么豆瓣的程序员是不是很辛苦,每天都要上网修改这个页面。因此,我们可以大胆猜测这是一个动态页面。但仅仅猜测是行不通的,我们必须证明这一点。这里我们将使用第二讲中提到的谷歌开发者工具。按F12或在网页空白处右击选择勾选(N),或按键盘上的组合键Ctrl + Shift + I来召唤我们的神器。如下所示:
今天我们不再使用左上角的鼠标按钮,而是使用红色框中的网络。下面是网页加载的所有文件,如下图所示:
如果下面没有结果,您需要在打开 Google Developer Tools 的同时刷新网页。
如上图所示,我们可以点击上方小红框中的“XHR”按钮,过滤掉这个网页中异步加载的内容。至于哪个是我们想要的,这是个问题。看左边的地址,我们似乎没有看到线索,所以我们一一点击。. . 经过枚举,我们发现第三个就是我们想要的,其内容如下图所示:
我们可以看到这个链接中收录的内容是以JSON格式显示的。这时候我们有了一个大致的思路,就是用requests模块下载这个链接的内容,然后用Python的json模块。解析。
然而,这似乎是一页内容。计数中只有 20 部电影。我们想要的是前 100 部电影。我们应该做什么?
没办法,毕竟是动态网页,可以根据请求更改内容,这里也没有登录操作,打开网页就可以看到,那我们能不能把网址改成进入下一页甚至下一页?页面的内容是什么?当然可以,不然我就写不下去了!
让我们仔细看看这个 URL 中传递的参数:
这时候我们可能不知道这五个参数是什么,但是我们可以找到规则,所以现在回到原来的网页,点击页面底部的“加载更多”,然后回到开发者工具,哇,多了一个网址,和刚才说的一样长,内容也一样长:
此 URL 还传递五个参数:
唯一的区别是名为“page_start”的关键字的值发生了变化。一个简单的翻译可能是页面的开头。看上面的“page_limit”,大概是指页数限制。查看右侧的响应内容。这个页面已经过了20个条目,也就是说“page_limit”是一个页面的条目数量限制,也就是20。这个数据不变,而“page_start”是在这个页面的条目数量这个页面的开头,那我们要不要把这个“page_start”改一下就可以得到下面的内容了?是的。
老规矩,先写个代码
# -*- coding: utf-8 -*-
import requests
import jsonfor i in range(5):
page_start = str(i * 20) # 注释1
url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=' + page_start # 注释2
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
response = requests.get(url=url, headers=headers, verify=False)
content = response.content.decode()
content_list = json.loads(content)['subjects'] # 注释3for item in content_list: # 注释4
title = item['title'] #注释5
rate = item['rate'] # 注释6
link = item['url'] # 注释7
print(title, rate, link)
最后,可以使用标准输入流写入txt文件,也可以使用xlwt模块写入EXCEL,也可以使用pymysql模块写入Mysql数据库,具体方法免费,请自行百度你自己。
至此,这种通过查找API并传递有效参数来重放API的方法已经介绍给大家了。这是一个非常通用的方法。它可以在很多网站中使用,并且速度非常快,并且具有最精简的结果。.
动态网络爬虫技术二模拟浏览器方法
虽然我们上面提到的API请求方式简单易用,速度快,但并不是所有的网站都会使用这种异步加载的方式来实现网站,有的网站会采取反爬虫措施来对付爬虫,比如常见的验证码。验证码虽然主要是用来防止CSRF攻击,但也有网站用来对付爬虫,比如某宝。这时候,我们将介绍另一个神器,Python 的 Selenium 模块。
Selenium 是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真实用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11), Mozilla Firefox, Safari, Google Chrome, Opera等。本工具的主要功能包括:测试与浏览器的兼容性-测试您的应用程序可以在不同的浏览器和操作系统上运行良好测试系统功能-创建回归测试以验证软件功能和用户需求支持自动记录动作和自动生成.Net、Java、Perl等多种语言的测试脚本。 (说明来自:百度百科-《硒》,链接失效请点击)
简单来说,Selenium 是一个主要用于自动化测试的工具。可以配合浏览器驱动运行在各个浏览器中,根据代码自动模拟人为操作,获取或控制网页元素。当然,Selenium 不是 Python 的产品,而是一个独立的项目。Python 提供对 Selenium 的支持。(您可以自行访问Selenium的主页,如果链接无效,请点击)
安装硒模块
要使用像Selenium这样的第三方工具,我们必须先安装它,这里仍然使用pip工具。以管理员权限运行命令行,输入pip install selenium。稍等片刻,即可完成安装。如果觉得连接官方pypi镜像的网络慢,可以使用国内豆瓣的镜像源,pip install selenium -i,加上这个-i参数和豆瓣pypi镜像的地址就够了。如果要默认使用豆瓣镜像源,请百度修改方法。
下载谷歌浏览器驱动程序
安装成功后,我们需要安装下一个必备的东西,浏览器驱动。前面说过,selenium需要配合浏览器驱动,所以我们以安装Google Chrome Driver为例。
首先,我们需要检查我们的谷歌浏览器版本。这可以在谷歌的“帮助”中查看。具体方法是打开Chrome,点击右上角的三个点状按钮,然后在弹出的菜单中选择帮助。(E) -> 关于谷歌浏览器 (G) 如下图:
笔者浏览器更新到最新版本63,老版本操作方法大致相同。
点击信息上的开关后,我们可以看到当前的Chrome版本。下图是一个例子:
Chrome 是在不断升级的,所以相应的驱动也要不断的升级,适配 Chrome 的版本。这里需要找到对应的ChromeDriver版本映射,推荐一个持续更新的CSDN博客(如果链接失效请点击:),根据版本映射表,下载对应版本的ChromeDriver,下载地址1()(如果链接失效,请访问:),下载地址2()(链接失效请访问:)。
安装 ChromeDriver
这里需要配置环境变量。如第一讲所述,为“Path”添加一行值。
首先,我们需要找到Chrome的安装位置。最简单的方法是在桌面找到谷歌浏览器的快捷方式,右击选择“打开文件位置”打开。比如我这里打开的路径是C:\Program Files(x86)\Google\Chrome\Application,然后我会在Path中添加这个路径。然后,我们需要将下载的ChromeDriver解压到exe程序,将单独的exe程序复制到刚才的路径下,如下图:
至此,ChromeDriver 安装完成。我们可以在命令行输入命令python进入python交互环境进行测试,如下图所示:
如果你的谷歌浏览器自动打开并跳转到百度主页,那么恭喜~
以某宝的松鼠店为例,爬取“坚果炒货”的产品名称、价格、销量和评论数
此页面的 URL 是:#TmshopSrchNav
老规矩,先放一段代码:
# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Chrome() # 注释1
url = 'https://sanzhisongshu.tmall.com/category-1124487841.htm?spm=a1z10.1-b-s.w5003-17763072511.42.6995d6732XB8Of&tsearch=y&scene=taobao_shop#TmshopSrchNav'
driver.maximize_window() # 注释2
driver.get(url) # 注释3
dl_list = driver.find_elements_by_class_name('item') # 注释4
for dl in dl_list:
name = dl.find_element_by_css_selector("[class='item-name J_TGoldData']").text # 注释5
price = dl.find_element_by_class_name('cprice-area').text # 注释6
sale = dl.find_element_by_class_name('sale-area').text # 注释7
comment = dl.find_element_by_xpath('//*[@id="J_ShopSearchResult"]/div/div[3]/div[1]/dl[1]/dd[2]/div/h4/a/span').text # 注释8
print(name, price, sale, comment)
driver.close() # 注释9
XPath 是 XML 路径语言,它是一种用于确定 XML(标准通用标记语言的子集)文档某个部分的位置的语言。XPath 基于 XML 树结构,具有不同类型的节点,包括元素节点、属性节点和文本节点,提供在数据结构树中查找节点的能力。最初,XPath 的初衷是将其用作 XPointer 和 XSLT 之间的通用语法模型。但是 XPath 很快就被开发人员采用为一种小型查询语言。(说明来自:百度百科-“XPath”,如果链接失败,请访问:)
这个例子的最终结果如下:
大家依然可以自由选择数据的存储方式。
这里需要注意的是,使用selenium进行数据爬取可能比之前的API请求方式慢很多。打开相应的窗口后,窗口中可能长时间没有动作,但这不一定是错误或程序卡住的迹象,也可能是程序在疯狂搜索网页元素。在此过程中,如果您不确定是否有错误,请不要进行其他操作,以免有时会导致元素失去焦点而导致莫名其妙的错误。
当然,硒的作用远不止这些。它可以模拟几乎人在网页上可以做出的行为,包括点击、打字等行为。这个比较适合一些网站填写验证码的情况,大家可以自行寻找更多有趣的内容。本次讲座到此结束。感谢您的耐心阅读。
课后作业
这里有两个小作业给大家,有兴趣的可以自己测试一下。
请使用API请求方式在QQ音乐上查找付费下载歌曲,无需登录账号即可下载歌曲。请用selenium爬取知乎首页热点话题或回答100个话题。
关于作者
作者是即将毕业的大四,自学爬虫,作为多个爬虫项目的主要开发者,对各种爬虫有一定的了解和项目经验,目前正在自学分布式爬虫的内容,以后会继续为大家关注更新。同时作者也是一位狂热的信息安全爱好者。谢谢你的支持。