python抓取动态网页(HTML网页时会模拟浏览器行为分析方法分析及注意事项 )
优采云 发布时间: 2022-03-07 09:21python抓取动态网页(HTML网页时会模拟浏览器行为分析方法分析及注意事项
)
介绍
有时,当我们天真地使用 urllib 库或 Scrapy 下载 HTML 页面时,会发现我们要提取的页面元素不在我们下载的 HTML 中,尽管它们在浏览器中似乎很容易获得。
这说明我们想要的元素是在我们的一些动作下通过js事件动态生成的。比如我们刷QQ空间或者微博评论的时候,我们一直在往下滑。网页越来越长,内容越来越多。这是人们又爱又恨的动态加载。
目前爬取动态页面有两种方法
分析页面请求 selenium 模拟浏览器行为1.分析页面请求
按键盘F12打开开发者工具,选择Network选项卡,选择JS(除了JS选项卡,也可能在XHR选项卡,当然也可以使用其他抓包工具),如图以下
然后,我们拖动右边的滚动条,然后我们会发现开发者工具里有新的js请求(有不少),但是如果你匆忙翻译的话,很容易看出哪个是评论, 如下所示
OK,复制出js请求的目标url
在浏览器中打开,发现我们要的数据就在这里,如下图
整个页面都是 json 格式的数据。对于京东来说,当用户下拉页面时,会触发一个js事件,将上面的请求发送到服务器去获取数据,然后将获取到的json数据通过一定的js逻辑填充到数据中。在 HTML 页面中。对于我们的 Spider,我们所要做的就是组织和提取这些 json 数据。
在实际应用中,我们当然不可能在每个页面中找出这个js发起的请求的目标地址,所以需要分析请求地址的规律。一般来说,法律比较容易找到,因为法律对于服务方来说太复杂了。维护也很困难。
2.Selenium 模拟浏览器行为
对于动态加载,可以看到 Selenium+Phantomjs 的强大。打开网页查看网页的源代码(注意不是检查元素),你会发现要爬取的信息不在源代码中。也就是说,无法从网页的源代码中解析得到数据。Selenium+Phantomjs 的强大之处之一是它可以捕获完整的源代码以
示例:根据给定名称搜索豆瓣电影的对应信息
#-*- coding:utf-8 -*-
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
url = ‘https://movie.douban.com/‘
#这个路径就是你添加到PATH的路径
driver = webdriver.PhantomJS(executable_path=‘C:/Python27/Scripts/phantomjs-2.1.1-windows/bin/phantomjs.exe‘)
driver.get(url)
#在搜索框上模拟输入信息并点击
elem = driver.find_element_by_name("search_text")
elem.send_keys("crazy")
elem.send_keys(Keys.RETURN)
#得到动态加载的网页
data = driver.page_source
soup = BeautifulSoup(data, "lxml")
# 进行匹配
for i in soup.select("div[class=‘item-root‘]"):
name = i.find("a", class_="title-text").text
pic = i.find("img").get(‘src‘)
url = i.find("a").get(‘href‘)
rate = ""
num = ""
if i.find("span", class_="rating_nums") is None:
print name.encode("gbk", "ignore"), pic, url
else:
rate = i.find("span", class_="rating_nums").text
num = i.find("span", class_="pl").text
print name.encode("gbk", "ignore"),pic,url,rate.encode("gbk", "ignore"),num.encode("gbk", "ignore")
Python动态爬取网页