动态网页抓取(通过浏览器审查元素解析真实网页地址和使用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爬虫实践

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线