Python爬虫技巧 | 调整参数无需for循环即可爬多页

本文作者:经管2101班 杨惠

实验项目:爬取浙江省宁波市农业农村局新闻信息并保存为excel

unsetunset一、观察网页unsetunset

首先利用Google Chrome谷歌浏览器进入浙江省宁波市农业农村局网站—市级新闻部分

网页地址:http://nyncj.ningbo.gov.cn/col/col1229058288/index.html

Python爬虫技巧 | 调整参数无需for循环即可爬多页

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

Python爬虫技巧 | 调整参数无需for循环即可爬多页

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

网址分析

Python爬虫技巧 | 调整参数无需for循环即可爬多页

GET请求

Python爬虫技巧 | 调整参数无需for循环即可爬多页

POST请求

Python爬虫技巧 | 调整参数无需for循环即可爬多页

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

Python爬虫技巧 | 调整参数无需for循环即可爬多页

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

Python爬虫技巧 | 调整参数无需for循环即可爬多页

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

Python爬虫技巧 | 调整参数无需for循环即可爬多页

unsetunset二、导入所需的第三方库unsetunset

#导入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这样的标记语言,并提取其中的相关信息。

unsetunset三、请求数据unsetunset

通过观察headers,这是一个POST请求,请求网址为http://nyncj.ningbo.gov.cn/module/jpage/dataproxy.jsp?+startrecord={页数}&endrecord={页数}&perpage=15

Python爬虫技巧 | 调整参数无需for循环即可爬多页

通过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,不用翻页爬取

Python爬虫技巧 | 调整参数无需for循环即可爬多页

以上请求数据代码如下:

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)

unsetunset四、解析数据unsetunset

通过观察标签定位,发现资源信息都储存在record标签之下,每一个record对应每一条的a标签内容即为所需要爬取的新闻标题,新闻网址链接,span标签对应新闻时间

Python爬虫技巧 | 调整参数无需for循环即可爬多页

代码如下:

#通过前面请求的数据,读取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]) #将新闻信息对应存放入列表

unsetunset五、存储数据unsetunset

利用pandas库将所爬取数据信息存储下来。

代码如下:

df=pd.DataFrame(items,columns=['标题','网址','时间'])
df.to_excel('宁波农业农村局新闻信息.xlsx',index=False)

unsetunset六、循环爬取unsetunset

若想爬取该网页全部新闻信息,可以观察到该网址记录数有5160条,调整record参数,发现最多一次性爬取451条。

Python爬虫技巧 | 调整参数无需for循环即可爬多页

如果全部爬取,需要引入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}

unsetunset全套代码unsetunset

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

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!