python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)

优采云 发布时间: 2021-12-14 20:38

  python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)

  用python爬取网站数据很方便,效率也很高,但是常用的BeautifSoup和requests的组合一般用于爬取静态页面(即网页上显示的数据)可以在html源码中找到,不是网站通过js或者ajax异步加载的),这种网站数据比较容易爬取。但是网站上的一些数据是通过执行js代码更新的。这时候,传统的方法就不那么适用了。这种情况下有几种方法:

  清除网页上的网络信息,更新页面,观察网页发送的请求。一些网站可以通过这种方式构造参数来简化爬虫。但适用范围还不够广。

  使用 selenium 模拟浏览器行为来更新网页以获得更新的数据。本文的其余部分将重点介绍这种方法。

  一、准备

  需要两个工具来模拟浏览器:

  1.selenium,可以直接通过pip install selenium安装。

  2.PhantomJS,这是一个无界面、脚本可编程的 WebKit 浏览器引擎。百度从其官方网站搜索并下载。下载后,无需安装。放在指定的路径。您只需要指定文件所在的路径即可。

  二、使用selenium模拟浏览器

  本文爬取网站的例子是:8099/ths-report/...

  学习示例时请不要抓取太多页面,只需通过过程了解如何抓取它。

  打开网站后可以看到要爬取的数据是一个普通的表,但是页面很多。

  

  在这个网站中,点击下一页的页面的url没有变化,通过执行一段js代码来更新页面。所以本文的思路是用selenium模拟浏览器点击,点击“下一步”更新页面数据,获取更新后的页面数据。这是完整的代码:

   # -*- coding:utf-8 -*-

  import requests

  from bs4 import BeautifulSoup

  import json

  import time

  from selenium import webdriver

  import sys

  reload(sys)

  sys.setdefaultencoding( "utf-8" )

  curpath=sys.path[0]

  print curpath

  def getData(url):

   # 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便

  driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")

  driver.set_page_load_timeout(30)

  time.sleep(3)

  html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息

  for page in range(3):

  html=driver.page_source # 获取网页的html数据

  soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可

  table=soup.find('table',class_="report-table")

  name=[]

  for th in table.find_all('tr')[0].find_all('th'):

  name.append(th.get_text()) # 获取表格的字段名称作为字典的键

  flag=0 # 标记,当爬取字段数据是为0,否则为1

  for tr in table.find_all('tr'):

  # 第一行为表格字段数据,因此跳过第一行

  if flag==1:

  dic={}

  i=0

  for td in tr.find_all('td'):

  dic[name[i]]=td.get_text()

  i+=1

  jsonDump(dic,url[1])#保存数据

  flag=1

   # 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可

  driver.find_element_by_link_text(u"下一页").click()

  

  def jsonDump(_json,name):

  """store json data"""

  with open(curpath+'/'+name+'.json','a') as outfile:

  json.dump(_json,outfile,ensure_ascii=False)

  with open(curpath+'/'+name+'.json','a') as outfile:

  outfile.write(',\n')

  if __name__ == '__main__':

  url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……

  getData(url) # 调用函数

复制代码

  本文通过driver.find_element_by_link_text方法获取下一页的位置。这是因为在这个网页中,这个标签没有唯一可识别的 id,也没有类。如果是通过xpath定位,第一页和其他页面的xpath路径不完全一样,需要加一个if来判断。所以直接通过链接的text参数进行定位。click() 函数模拟浏览器中的点击操作。

  硒非常强大。可以解决很多普通爬虫无法解决的问题。可以模拟点击、鼠标移动、提交表单(应用如:登录邮箱账号、登录wifi等,网上例子很多,我暂时还没试过),当你遇到一些非常规网站数据爬取难度很大,不妨试试selenium+phantomjs。

  最后:【可以帮到你】

  

  这个资料应该是【软件测试】的朋友们最全面、最全的准备库了。这个仓库陪伴了数以万计的测试工程师走过最艰难的旅程,也希望能帮到你!关注我的微信公众号【软件测试道】免费获取~

  我的学习交流群:644956177群内有技术高手交流分享~

  如果我的博客对你有帮助,如果你喜欢我的博客内容,请一键“点赞”“评论”“采集”!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线