动态网页抓取(通过浏览器审查元素解析真实网页地址和使用Selenium模拟浏览器)
优采云 发布时间: 2021-10-31 09:15动态网页抓取(通过浏览器审查元素解析真实网页地址和使用Selenium模拟浏览器)
之前抓取的网页都是静态网页,此类网页的浏览器中显示的内容都位于HTML源代码中。但是,由于主流的网站使用JavaScript来展示网页内容,不像静态网页,使用JavaScript时,很多内容不会出现在HTML源代码中,所以抓取静态网页的技术可能不行适当地。因此,我们需要使用两种技术进行动态网络爬虫:通过浏览器评论元素解析真实网址和使用Selenium模拟浏览器。
1 动态爬取示例
因此,如果我们使用AJAX加载的动态网页,我们如何抓取动态加载的内容呢?有两种方式:
通过浏览器解析地址查看元素并模拟浏览器爬取selenium 2动态爬取示例
方法一操作步骤:
打开浏览器“检查”功能。找到真正的数据地址。单击对话框中的网络,然后刷新网页。此时,网络将显示浏览器从 Web 服务器获取的所有文件。通常,此过程称为“数据包捕获”。爬取真实评论数据地址。现在我们已经找到了真实地址,我们可以直接使用requests来请求这个地址并获取数据。从 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):
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)
3 模拟浏览器爬取selenium
我们可以使用 Python 的 selenium 库来模拟浏览器来完成爬取。Selenium 是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,浏览器自动按照脚本代码进行点击、输入、打开、验证等操作,就像真实用户在操作一样。
步:
找到注释的 HTML 代码标记。使用Chrome打开文章页面,右击页面,打开“检查”选项。按照第二章的方法,定位评论数据。尝试获取评论数据。在原打开页面的代码数据上,我们可以使用如下代码获取第一条评论数据。在下面的代码中,driver.find_element_by_css_selector 使用CSS选择器查找元素,并找到class为'reply-content'的div元素;find_element_by_tag_name 搜索元素的标签,即查找注释中的 p 元素。最后输出p元素中的text text。我们可以在 jupyter 中输入 driver.page_source
找出未找到注释元素的原因。通过排查,我们发现原代码中的JavaScript被解析成一个iframe,也就是说所有的评论都安装在这个frame中,里面的评论没有被解析,所以我们可以通过div.reply-content元素找不到。这时候就需要添加iframe的解析了。
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path = r'C:\Users\santostang\Desktop\geckodriver.exe')
driver.implicitly_wait(20) # 隐性等待,最长等20秒
#把上述地址改成你电脑中geckodriver.exe程序的地址
driver.get("http://www.santostang.com/2018/07/04/hello-world/")
time.sleep(5)
for i in range(0,3):
# 下滑到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 转换iframe,再找到查看更多,点击
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))
load_more = driver.find_element_by_css_selector('button.more-btn')
load_more.click()
# 把iframe又转回去
driver.switch_to.default_content()
time.sleep(2)
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))
comments = driver.find_elements_by_css_selector('div.reply-content')
for eachcomment in comments:
content = eachcomment.find_element_by_tag_name('p')
print (content.text)
selenium中选择元素的方法有很多:
有时,我们需要查找多个元素。在上面的例子中,我们搜索了所有的评论。所以,也有相应的元素选择方法,就是在上面的元素后面加上s成为元素。
其中,xpath 和 css_selector 是比较好的方法。一方面,它们更清晰,另一方面,它们比其他定位元素的方法更准确。
另外,我们还可以使用selenium操作元素方法来自动操作网页。操作元素的常用方法如下:
-clear 清除元素的内容
– Send_keys 模拟按键输入
– 单击以单击元素
– 提交提交表格
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() #点击登录
由于篇幅有限,感兴趣的读者可以查看selenium官方文档:
4 Selenium爬虫实践