浏览器抓取网页(用到动态网页抓取的两种技术:(2)使用selenium模拟浏览器 )
优采云 发布时间: 2022-03-18 09:28浏览器抓取网页(用到动态网页抓取的两种技术:(2)使用selenium模拟浏览器
)
关于静态网页
我们知道,静态网页在浏览器中显示的内容是在 HTML 源代码中的。但是由于主流的网站都使用JavaScript来展示网页内容,不像静态网页,在使用JavaScript的时候,很多内容不会出现在HTML源代码中,所以爬取静态网页的技术可能不会工作正常使用。因此,我们需要使用两种技术进行动态网页抓取:
(1)通过浏览器检查元素解析真实网址
(2)使用selenium模拟浏览器的方法
异步更新技术
AJAX(异步 Javascript 和 XML,异步 JavaScript 和 XML)
它的价值在于可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。一方面减少了网页重复内容的下载,另一方面也节省了流量。
解析真实网址
我们的目标是抓取目标 文章 上的所有评论。
(1)首先,打开网页的“检查”功能。
(2)找到真正的数据地址。点击页面中的网络选项,然后刷新页面。这个过程一般称为“抓包”。
(3)找到真实评论的数据地址,然后使用requests请求这个地址获取数据。
import requests
import json
link = 'https://api-zero.livere.com/v1/comments/list?callback=jQuery112405205264113983896_1582798704769&limit=10&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&code=&_=1582798704771'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
r = requests.get(link, headers= headers)
print(r.text)
(4)从json数据中提取评论。上面的结果比较乱,其实是json数据,我们可以使用json库来解析数据,从中提取出我们想要的数据。
import requests
import json
def single_page_comment(link):
headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
r = requests.get(link, headers= headers)
# 获取 json 的 string
json_string = r.text
json_string = json_string[json_string.find('{'):-2]
json_data = json.loads(json_string)
comment_list = json_data['results']['parents']
for eachone in comment_list:
message = eachone['content']
print (message)
for page in range(1,4): #打印前4页的评论
link1 = "https://api-zero.livere.com/v1/comments/list?callback=jQuery112403473268296510956_1531502963311&limit=10&offset="
link2 = "&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1531502963316"
page_str = str(page)
link = link1 + page_str + link2
print (link)
single_page_comment(link)
(5)以上只是爬取文章的评论第一页,很简单。其实我们经常需要爬取所有页面,如果还是手动逐页翻页的话找到评论数据地址是很费力的,所以下面将介绍网页URL地址的规则,并使用for循环进行爬取,会很容易的。
如果我们对比上面的两个地址,可以发现URL地址中有两个特别重要的变量,offset和limit。稍微了解一下,我们可以知道limit代表每页最大评论数,也就是说,这里每页最多可以显示30条评论;offset表示页数,第一页的偏移量为0,第二页的偏移量为1,那么第三页的偏移量为3。
因此,我们只需要改变URL中offset的值,就可以实现换页。
通过Selenium模拟浏览器捕获一、Selenium+Python环境搭建和配置
1.1 硒简介
Selenium 是一个用于 Web 的自动化测试工具。许多学习功能自动化的学生开始偏爱 selenium,因为它与 QTP 相比具有许多优点:
(1)免费,破解QTP不再头疼
(2)小,只是针对不同语言的一个包,QTP需要下载安装1G以上的程序。这也是最重要的一点,不管你对C、java、 ruby, python, 或者全是C#,可以通过selenium完成自动化测试,QTP只支持VBS,selenium支持多平台:windows,linux,MAC,支持多浏览器:ie,firefox,safari,opera,chrome
1.2 selenium+Python环境配置
前提条件:Python开发环境已经安装(建议安装Python3.5及以上)
安装步骤:
(1)安装硒
赢:pip install selenium
Mac:pip3 安装硒
(2)安装网络驱动程序
火狐:
铬合金:
(3)这里我以 Windows Chrome 为例:
比如我的版本是:version 80.0.3987.122(正式版)(64位)
然后下载80.0.3937.106
注意:webdriver需要对应对应的浏览器版本和selenium版本
二、元素定位和浏览器基本操作2.1 启动浏览器
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')
2.2 使用 Selenium 选择元素(1)id 定位
find_element_by_id()
例如
文本
您可以使用 find_element_by_id("bdy-inner")
(2)名称位置
find_element_by_name()
例如,您可以使用 find_element_by_name("username")
(3)class_name 定位
class 标准属性,不是唯一的,通常找一个类的元素
find_element_by_class_name()
例如
测试
您可以使用 find_element_by_class_name("cheese")
还有另一个函数可以选择元素的类属性:
find_element_by_css_selector()
例如
测试
您可以使用 find_element_by_css_selector()("div.cheese")
(4)tag_name 定位
driver.find_element_by_tag_name()
按元素名称选择,如 Welcome 可以使用 driver.find_element_by_tag_name('h1')
(5)按链接地址定位
find_element_by_link_text()
例如,继续可以使用 driver.find_element_by_link_text("Continue")
(6)由链接的部分地址选择
find_element_by_partial_link_text()
例如,继续可以使用 driver.find_element_by_partial_link_text("Conti")
(7)通过 xpath 选择
find_element_by_xpath()
例如,您可以使用 driver.find_element_by_xpath("//form[@id='loginForm']")
有时,我们需要查找多个元素,只需在上面的元素后添加 s 即可。
其中,xpath 和 css_selector 是比较好的方法。一方面相对清晰,另一方面相对于其他方法定位元素更准确。
Selenium 的高级操作:
(1)控制 CSS 的加载。
(2)控制图像文件的显示。
(3)控制 JavaScript 的执行。
这三种方法可以加快 Selenium 的爬行速度。
或者,您可以使用 Selenium 的 click 方法来操作元素。操作元素的常用方法如下:
(1)Clear 清除元素的内容
(2)send_keys 模拟按键输入
(3)Click 点击元素
(4)Submit 提交表单
例如:
user = driver.find_element_by_name("username") #找到用户名输入框
user.clear() #清除用户名输入框内容
user.send_keys("1234567") #在框中输入用户名
pwd = driver.find_element_by_name("password") #找到密码输入框
pwd.clear() #清除密码输入框的内容
pwd.send_keys("******") #在框中输入密码
driver.find_element_by_id("loginBtn").click() #单击登录
一个具体的例子,比如我要打开百度,然后自动查询“你的名字”:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
input_text = driver.find_element_by_id("kw")
input_text.send_keys("你的名字")
driver.find_element_by_id("su").click()