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

优采云 发布时间: 2021-10-16 10:08

  动态网页抓取(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 的强大之处在于能够捕获完整的源代码

  示例:在豆瓣电影上根据给定的名称搜索相应信息

  #-*- 编码:utf-8 -*-

  importsysfrom selenium importwebdriverfrom mon.keys importKeysfrom bs4 importBeautifulSoup

  重新加载(系统)

  sys.setdefaultencoding('utf-8')

  网址 ='#39;

  #这个路径就是你添加到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("疯狂")

  elem.send_keys(Keys.RETURN)#获取动态加载的网页

  数据 =driver.page_source

  汤 = BeautifulSoup(data, "lxml")#match

  对于我在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=""

  如果 i.find("span", class_="rating_nums") isNone:print name.encode("gbk", "ignore"), pic, urlelse:

  rate= i.find("span", class_="rating_nums").text

  num= i.find("span", class_="pl").textprint name.encode("gbk", "ignore"),pic,url,rate.encode("gbk", "ignore"),num. 编码(“gbk”,“忽略”)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线