求教,请问我在网上找到的这个代码,每次只能爬取第一页数据,怎么才能实现翻页爬取呢

import requests
from lxml import etree
from time import sleep
from fake_useragent import UserAgent
import pandas as pd

name_all = []
min_price_all = []
mean_price_all = []
max_price_all = []
guige_all = []
unit_all = []
data_all = []


for i in range(5):
    print(i)
    UA = UserAgent().edge
    url_base='http://www.xinfadi.com.cn/marketanalysis/0/list/{}.shtml'
    url = 'http://www.xinfadi.com.cn/marketanalysis/0/list/{}.shtml'.format(i+1)
    headers={
        'User-Agent':UA
    }
    response=requests.get(url,headers=headers)
    sleep(3)
 #   print(response.text)
 #   print(response.encoding)
    e = etree.HTML(response.text)
    name = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[1]/text()''')
    min_price = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[2]/text()''')
    mean_price = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[3]/text()''')
    max_price = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[4]/text()''')
    guige = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[5]/text()''')
    unit = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[6]/text()''')
    data = e.xpath('''//table[@class='hq_table']/tr[position()>1]/td[7]/text()''')

    name_all = name_all+name
    min_price_all = min_price_all+min_price
    mean_price_all = mean_price_all+mean_price
    max_price_all=max_price_all+max_price
    guige_all = guige_all+guige
    unit_all = unit_all+unit
    data_all=data_all+data
    if i % 300 == 0:
        all_info = {
                    '名称': name_all,
                    '最低价格': min_price_all,
                    '平均价格': mean_price_all,
                    '最高价格': max_price_all,
                    '规格': guige_all,
                    '单位':unit_all,
                    '日期':data_all
                }
        outdata = pd.DataFrame(all_info)
print(outdata)
        #outdata.to_csv('C:\\Users\geng\Desktop\蔬菜价格数据\新发地市场价格.csv', encoding='GBK')



上面这个是在网上找到的一段爬取蔬菜价格的代码,只能爬取第一页的数据,无法实现翻页


import requests #用来发送请求

from bs4 import BeautifulSoup#用来解析网页

import time#导入时间隔

import codecs
with open('新发地果蔬价格.csv','wb+') as cf:
    cf.write(codecs.BOM_UTF8)

for i in range(5):#爬取第一页到第100页的数据
    f = open("新发地果蔬价格.csv",mode='a',encoding="utf8")#写人文件新发地果蔬文件名,格式是csv.字符编码,a是文字
    resp = requests.get(f"http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml")
    print(resp)#200: ok, 302:重定向, 404:页面丢失,500:服务器错误
    page_one = BeautifulSoup(resp.text, "html.parser")#通过html来,把请求的网页打印出来
    #找到表格数据(table)
    table = page_one.find("table",attrs={"class":"hq_table"}) #表格特征是class和hq_table
    #找到所有表格的所有tr
    trs = table.find_all("tr")[1:]#获取表格的内容,通过列表来,第0个元素不要了,[第一行,第二行,到三行......
    for tr in trs:#tr是每一行内容,在所有的行中,遍历每一列的内容
        tds = tr.find_all("td")#tds是每一列的内容,[第一列,第二列,第三列......]
        name = tds[0].text.strip()#从第0项元素开始取值,取文本形式的内容数据,strip去掉左右两边所有的空格
        lowest = tds[1].text.strip()#获取到数据,去掉左右空格
        avg = tds[2].text.strip()#获取平均价数据,去掉左右空格
        highest = tds[3].text.strip()#获取最高价,去掉左右空格
        fenlei = tds[4].text.strip()#获取分类,去掉左右的空格
        danwei = tds[5].text.strip()#获取单位数据,去掉左右的空格
        date = tds[6].text.strip()#获取日期数据,去掉左右空ge
        f.write(f"{name},{lowest},{avg},{highest},{fenlei},{danwei},{date}\n")#把每种果蔬的名字.日期,价格写入,且换行
        #print(f"{name},{lowest},{avg},{highest},{fenlei},{danwei},{date}")
        print(f"一个页面完事了{i}")
    time.sleep(1)#防止服务器蹦了,间隔一秒钟


这是另一段代码,功能相同,也是无法翻页爬取,请问怎么才能翻页爬取内容

resp = requests.get(f"http://www.xinfadi.com.cn/marketanalysis/0/list/{i}.shtml")

把你的代码替换成我的

第一页 1.shtml 

第二页 2.shtml

希望能采纳

代码作如下调整才可,一方面要将页码传入url,另一方面直接用with open(...) 保存数据。

import requests  # 用来发送请求

from bs4 import BeautifulSoup  # 用来解析网页

import time  # 导入时间隔

#import codecs
#with open('新发地果蔬价格.csv', 'wb+') as cf:cf.write(codecs.BOM_UTF8)
with open("新发地果蔬价格.csv", mode='a', encoding="utf8") as f:
    for i in range(1,11):  # 爬取第一页到第100页的数据
        # 写人文件新发地果蔬文件名,格式是csv.字符编码,a是文字
        
        resp = requests.get(
            f"http://www.xinfadi.com.cn/marketanalysis/0/list/{i}.shtml")
        print(resp)  # 200: ok, 302:重定向, 404:页面丢失,500:服务器错误
        page_one = BeautifulSoup(resp.text, "html.parser")  # 通过html来,把请求的网页打印出来
        #找到表格数据(table)
        # 表格特征是class和hq_table
        table = page_one.find("table", attrs={"class": "hq_table"})
        #找到所有表格的所有tr
        trs = table.find_all("tr")[1:]  # 获取表格的内容,通过列表来,第0个元素不要了,[第一行,第二行,到三行......
        for tr in trs:  # tr是每一行内容,在所有的行中,遍历每一列的内容
            tds = tr.find_all("td")  # tds是每一列的内容,[第一列,第二列,第三列......]
            name = tds[0].text.strip()  # 从第0项元素开始取值,取文本形式的内容数据,strip去掉左右两边所有的空格
            lowest = tds[1].text.strip()  # 获取到数据,去掉左右空格
            avg = tds[2].text.strip()  # 获取平均价数据,去掉左右空格
            highest = tds[3].text.strip()  # 获取最高价,去掉左右空格
            fenlei = tds[4].text.strip()  # 获取分类,去掉左右的空格
            danwei = tds[5].text.strip()  # 获取单位数据,去掉左右的空格
            date = tds[6].text.strip()  # 获取日期数据,去掉左右空ge
            # 把每种果蔬的名字.日期,价格写入,且换行
            f.write(f"{name},{lowest},{avg},{highest},{fenlei},{danwei},{date}\n")
            #print(f"{name},{lowest},{avg},{highest},{fenlei},{danwei},{date}")
        print(f"一个页面完事了{i}")
        time.sleep(1)  # 防止服务器蹦了,间隔一秒钟

 

前面一个可以拉取到数据,后面一个翻页动作都没有

    if i % 300 == 0:
        all_info = {
                    '名称': name_all,
                    '最低价格': min_price_all,
                    '平均价格': mean_price_all,
                    '最高价格': max_price_all,
                    '规格': guige_all,
                    '单位':unit_all,
                    '日期':data_all
                }
        outdata = pd.DataFrame(all_info)
这能进条件?

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y