python抓取动态网页(HTML网页时会模拟浏览器行为分析方法分析及注意事项 )

优采云 发布时间: 2021-11-24 02:14

  python抓取动态网页(HTML网页时会模拟浏览器行为分析方法分析及注意事项

)

  介绍

  有时,当我们天真地使用urllib库或Scrapy下载HTML网页时,我们发现我们要提取的网页元素不在我们下载的HTML中,即使它们在浏览器中看起来很容易获得。

  这说明我们想要的元素是在我们的一些操作下通过js事件动态生成的。例如,当我们滑动Qzone或微博评论时,我们一直向下滑动。网页越来越长,内容也越来越多。这就是让人又爱又恨的动态加载。

  目前有两种爬取动态页面的方式

  分析页面请求 selenium 模拟浏览器行为1.分析页面请求

  键盘F12打开开发者工具,选择Network选项卡,选择JS(除了JS选项卡和XHR选项卡,当然也可以使用其他抓包工具),如下图

  

  然后,让我们拖动右侧的滚动条,然后我们会发现开发者工具中有新的js请求(很多),但是经过麻烦的翻译,很容易看出哪个是评论,如下所示

  

  OK,复制js请求的目标url

  

  在浏览器中打开,发现我们想要的数据就在这里,如下图

  

  整个页面都是json格式的数据。对于京东来说,当用户下拉页面时,会触发一个js事件,将上面的请求发送到服务器去取数据,将取到的json数据填入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")

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线