本文作者:经管2101班 杨惠
实验项目:爬取浙江省宁波市农业农村局新闻信息并保存为excel
一、观察网页
首先利用Google Chrome谷歌浏览器进入浙江省宁波市农业农村局网站—市级新闻部分
网页地址:http://nyncj.ningbo.gov.cn/col/col1229058288/index.html

判断该爬取网址是为静态网页或为动态网页。在该网址所显示页面右击选择检查.

点击网络并刷新并查看网页信息,通过不断的切换页面,发现该网站,前三页为GET请求,后面的页面为POST请求,发现这是一个动态网页,网址为:http://nyncj.ningbo.gov.cn/module/jpage/dataproxy.jsp?startrecord={页数}&endrecord={页数}&perpage=15
网址分析

GET请求

POST请求

查看每个页面的资源信息加载情况,发现每加载三页会出现这一接口,即三页的信息都在这一个接口里,下图一共加载了10页即获得三个接口。

检查资源存放的接口,发现资源信息都储存在record标签之下,每一个record对应每一条的a标签内容即为所需要爬取的新闻标题、新闻网址链接(绿色框部分)

下图为4-6页的新闻信息内容,后面的页面以此类推,都相应存储在每三页一个接口资源中。

二、导入所需的第三方库
#导入pandas库,将其简写为pd
import pandas as pd
#导入requests库,进行网页数据请求,获取数据
import requests
#导入 BeautifulSoup库,解析XML内容
from bs4 import BeautifulSoup
Pandas的主要数据结构是DataFrame,类似于电子表格或SQL表。
requests库是Python中一个简单易用的HTTP客户端库,可以帮助我们轻松发送各种HTTP请求。
BeautifulSoup能够处理诸如HTML和XML这样的标记语言,并提取其中的相关信息。
三、请求数据
通过观察headers,这是一个POST请求,请求网址为http://nyncj.ningbo.gov.cn/module/jpage/dataproxy.jsp?+startrecord={页数}&endrecord={页数}&perpage=15

通过User-Agent,Referer,Cookie,伪装浏览器,对应各参数信息来请求数据。
通过观察可以发现4-6页字符参数(如下图)为
params = {'startrecord': '46','endrecord': '90','perpage': '15'}
即4-6页从46条新闻到90条新闻,每页15条,共45条。
可以推出,若爬取10页该网址信息,一共150条,即从1条新闻到150条新闻,每页50条,共150条,即params = {‘startrecord’: ‘1’,’endrecord’: ‘150’,’perpage’: ’50’}。
直接修改startrecord和endrecord,寻找规律确定perpage,不用翻页爬取

以上请求数据代码如下:
headers = {
'Referer': 'http://nyncj.ningbo.gov.cn/col/col1229058288/index.html? uid=8748867&pageNum=1',
'User-Agent': 'Mozilla/5.0(Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/605.1.15 (KHTML,like Gecko)Version/15.6.1 Safari/605.1.15',
'Cookie':'SERVERID=b2ba659a0bf802d127f2ffc5234eeeba|1713361441|1713361267; NBSESSIONID=24e08b87-38ad-4637-be76-7623ad8de7c3; arialoadData=false; zh_choose=n'}
params = {
'startrecord': '1',
'endrecord': '150',
'perpage': '50'}
data = {
'col': '1',
'appid': '1',
'webid': '3431',
'path': '/',
'columnid': '1229058288',
'sourceContentType': '1',
'unitid': '8748867',
'webname': '宁波市农业农村局门户网站',
'permissiontype': '0'}
response = requests.post(
'http://nyncj.ningbo.gov.cn/module/jpage/dataproxy.jsp',
params=params,
headers=headers,
data=data,
verify=False)
四、解析数据
通过观察标签定位,发现资源信息都储存在record标签之下,每一个record对应每一条的a标签内容即为所需要爬取的新闻标题,新闻网址链接,span标签对应新闻时间

代码如下:
#通过前面请求的数据,读取xml文件
#with open('test.xml', 'wb') as f:
#f.write(response.content)
#将读取的信息数据放入soup中
soup = BeautifulSoup(response.text, 'lxml')
#在soup中找到所有record标签
records = soup.find_all('record')
#定义一个空列表,存放信息
items=[ ]
#作for循环,定位a标签文本、网址链接(注意这里a标签下的网址信息只是部分,需要补齐
for record in records:
a = record.find('a')
title = a.text #标题
href ='http://nyncj.ningbo.gov.cn'+a.get('href') #网址链接
time=record.find('span').text #新闻时间
items.append([title, href,time]) #将新闻信息对应存放入列表
五、存储数据
利用pandas库将所爬取数据信息存储下来。
代码如下:
df=pd.DataFrame(items,columns=['标题','网址','时间'])
df.to_excel('宁波农业农村局新闻信息.xlsx',index=False)
六、循环爬取
若想爬取该网页全部新闻信息,可以观察到该网址记录数有5160条,调整record参数,发现最多一次性爬取451条。

如果全部爬取,需要引入for循环,做5160/451 向上取整= 12次循环就可以爬取到全部信息。
如果我们做的是翻页循环,每页15条数据,需要做5160/15向上取整= 345次循环!
因此我们通过调整参数,大大提高了爬虫效率!
引入for循环,代码如下:
for i in range(0,12):
params = {
'startrecord': 451*i+1,
'endrecord': 451*i+451,
'perpage': 300}
全套代码
import requests
import pandas as pd
from bs4 import BeautifulSoup
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',
'Cookie': 'zh_choose=n; arialoadData=false; NBSESSIONID=c288ab97-9b3a-410a-8386- 3ccd3eee83b4; SERVERID=b2ba659a0bf802d127f2ffc5234eeeba|1713517586|1713517540',
'Origin': 'http://nyncj.ningbo.gov.cn',
'Referer''http://nyncj.ningbo.gov.cn/col/col1229058288/index.htmluid=8748867&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'}
data = {
'col': '1',
'appid': '1',
'webid': '3431',
'path': '/',
'columnid': '1229058288',
'sourceContentType': '1',
'unitid': '8748867',
'webname': '宁波市农业农村局门户网站',
'permissiontype': '0'}
items = []
for i in range(0,12):
params = {
'startrecord': 451*i+1,
'endrecord': 451*i+451,
'perpage': 300}
r = requests.post(
'http://nyncj.ningbo.gov.cn/module/jpage/dataproxy.jsp',
params=params,
headers=headers,
data=data,
verify=False)
soup = BeautifulSoup(r.text,'lxml')
records = soup.find_all('record')
for record in records:
a = record.find('a')
title = a.text
href ='http://nyncj.ningbo.gov.cn'+a.get('href')
time=record.find('span').text
items.append([title, href,time])
df=pd.DataFrame(items,columns=['标题','网址','时间'])
df.to_excel('宁波农业农村局新闻信息5160.xlsx',index=False)
原文始发于微信公众号(Python for Finance):Python爬虫技巧 | 调整参数无需for循环即可爬多页
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/288301.html