python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)
优采云 发布时间: 2022-01-13 00:00python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)
使用python爬取网站数据非常方便高效,但是常用的组合是使用BeautifSoup和requests爬取静态页面(即网页上显示的数据可以在html源码中找到)代码,不是网站通过js或者ajax异步加载的),这种类型的网站数据比较容易爬取。但是网站上的一些数据是通过执行js代码来更新的,传统的方法不太适用。在这种情况下有几种方法:
清除网页上的网络信息,更新页面,观察网页发出的请求。有的网站可以通过这种方式构造参数,从而简化爬虫。但适用范围不够广泛。
使用 selenium 模拟浏览器行为来更新网页以获取更新的数据。本文将在以下部分重点介绍此方法。
一、准备
模拟浏览器需要两个工具:
1.selenium 可以通过 pip install selenium 直接安装。
2.PhantomJS,这是一个无接口,可脚本化的WebKit浏览器引擎,百度搜索,在其官网下载,下载后无需安装,放到指定路径,只需要使用指定路径文件所在的位置。
二、使用selenium模拟浏览器
本文爬取网站的例子为::8099/ths-report/report!list.action?xmlname=46(最新测试发现网站打不开,2021年5月25日)
学习示例时请不要爬太多页面,只需通过过程了解如何爬取即可。
打开网站后,可以看到要爬取的数据是一个正则表,但是页面很多。
在这个网站中,点击下一页的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,也没有class。如果是通过xpath定位,则首页和其他页面的xpath路径不完全相同,需要加一个if来判断。所以直接通过链接的text参数定位。click() 函数模拟浏览器中的点击。
硒的功能非常强大。可以解决很多普通爬虫在爬虫中使用时无法解决的问题。可以模拟点击、鼠标移动、提交表单(登录邮箱、登录wifi等应用,网上有很多例子,我暂时还没试过),当你遇到一些标新立异的网站数据爬取很困难,不妨试试selenium+phantomjs。