本文是爬虫进阶内容,需要爬虫基础。
目标网页:http://www.iachina.cn/col/col41/index.html?uid=1508&pageNum=1
此网页是动态网页,神奇之处在于不用设置循环语句翻页爬取,而是直接修改post请求的data参数就可以爬取翻页内容。
本文起源于农经管2101班杨惠同学爬虫时遇到了问题,她进行积极的思考尝试,并搜索到了统计学人的如下教程:https://mp.weixin.qq.com/s/WDdKs7lXjbYBPFDPrLkm_A,这也是我第一次碰到这种类型的网页,遂记录下来。
本文参考教程的公众号为:
观察网页
-
观察第一页,出现一个动态网页,查看response,好像有点奇怪

-
翻第2页,第3页时,Network保持不变。 -
翻到第4页的时候,出现一个dataproxy.jsp的网页,发现第4、5、6页的信息都在该网页上。



查看该网页的payload,startrecord=49,endrecord=96,perpage=16,endrecord-startrecord+1 = 48,说明开始数是49,结束数是96,一共有48条记录,每页记录是16个。

-
翻到第7页的时候,又出现一个dataproxy.jsp的网页,发现第7页的信息都在该网页上。

查看该网页的payload,startrecord=97,endrecord=107,perpage=16,endrecord-startrecord+1 = 48,说明开始数是97,结束数是107,一共有11条记录,每页记录是16个。

说明翻页的时候,是startrecord和endrecord在变化,表示的是开始的记录数和结束的记录数,这不是页码参数,那我们能不能直接调整startrecord和endrecord,进行all in 呢?可以!目标网页共有107条记录,故我们可以设置startrecord=1,endrecord=107,至于perpage也可以设置大一点。

请求数据
import requests
headers = {
'Accept': 'application/xml, text/xml, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'http://www.iachina.cn',
'Referer': 'http://www.iachina.cn/col/col41/index.html?uid=1508&pageNum=3',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
params = {
'startrecord': '1',
'endrecord': '107',
'perpage': '107', #设置大一点,一次性返回所有的文章
}
data = {
'col': '1',
'appid': '1',
'webid': '1',
'path': '/',
'columnid': '41',
'sourceContentType': '8',
'unitid': '1508',
'webname': '中国保险行业协会',
'permissiontype': '0',
}
r = requests.post(
'http://www.iachina.cn/module/web/jpage/dataproxy.jsp',
params=params,
headers=headers,
data=data,
verify=False,
)
print(r.text)

解析数据
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text,'lxml')
items = []
a_list = soup.find_all('a') # 获取所有的链接
for a in a_list:
title = a.text # 获取链接标题
href = 'http://www.iachina.cn'+a.get('href') # 获取链接网址
item = [title,href]
print(item)
items.append(item)


保存数据
import pandas as pd
df = pd.DataFrame(items)
df.to_excel('保险业经营数据索引.xlsx')

原文始发于微信公众号(Python for Finance):Python爬取中国保险行业协会统计数据
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/281844.html