爬虫网址加年代会报错且无法将内容保存进不同sheet

想让大家帮我看看,爬虫时把网址加上年代筛选条件就会报错,这应该如何解决?还有就是为什么不能通过循环把不同年代的信息写进不同的sheet里?

import requests
from bs4 import BeautifulSoup
import xlwt
import time

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}

def main():
    keyword = "可再生能源"
    datalist = []
    savepath = "政策分年份.xls"
    for year in range(1995,2004):
        for start_num in range(1,4):
            data = searchlaw(keyword,start_num,year)
            datalist.extend(data)
            saveData(datalist, savepath,year)
            time.sleep(10)
    for item in datalist:
        print(item)
def searchlaw(keyword, start_num,year):
    response = requests.get \
        (f"http://law1.law-star.com/search?kw={keyword}&dbt=chl&dbt=lar&rjs5_11={year}&p={start_num}", headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "lxml")
    all_titles = soup.findAll("h2")
    datalist = []
    for title in all_titles:
        data = []
        try:
            title_name = title.find("a")["title"]
            link = title.find("a")["href"]
            data.append(title_name)
            data.append(link)
            datalist.append(data)
        except:
            continue
    all_times = soup.find_all("p")
    for (index,time) in enumerate(all_times):
         datalist[index].append(time.text)
    return datalist
def saveData(datalist, savepath,year):
    print("save....")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)
    sheet = book.add_sheet(f'{year}', cell_overwrite_ok=True)
    col = ("文件名", "链接","文号")
    for i in range(0, 3):
        sheet.write(0, i, col[i])
    for i in range(0,len(datalist)):
        print("第%d条" % (i + 1))
        data = datalist[i]
        for j in range(0, 3):
            sheet.write(i + 1, j, data[j])
    book.save(savepath)
if __name__ == "__main__":
    main()

报错如下:

img

报错部分爬取的内容形式如下:

img

将网址修改为不包含年代筛选条件的网址后可以正常输出,但是在excel里保存sheet时内容会覆盖

有些年份+关键字只有1页,采集第二页没记录,但是里面存在一个p标签,但是datalist长度为0,所以越界了,

写入Excel也有问题,采集完毕后再一次性写入,要不也是最后一个年份保存,覆盖了其他年份的

改下面即可。

import requests
from bs4 import BeautifulSoup
import xlwt
import time

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}

def main():
    keyword = "可再生能源"
    datalist = {}
    savepath = "政策分年份.xls"
    for year in range(1995,2004):
        datalist[year]=[]
        for start_num in range(1,4):
            data = searchlaw(keyword,start_num,year)
            if not data:##只有一页或者没有结果,退出循序
                break

            datalist[year].extend(data)

    saveData(datalist, savepath)
           
def searchlaw(keyword, start_num,year):
    url=f"http://law1.law-star.com/search?kw={keyword}&dbt=chl&dbt=lar&rjs5_11={year}&p={start_num}"
    print(f'采集{url}')
    response = requests.get(url, headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "lxml")
    all_titles = soup.findAll("h2")
    if len(all_titles)==0:##有些年份+关键字只有1页
        return None
    datalist = []
    for title in all_titles:
        data = []
        try:
            title_name = title.find("a")["title"]
            link = title.find("a")["href"]
            data.append(title_name)
            data.append(link)
            datalist.append(data)
        except:
            continue
    all_times = soup.find_all("p")
    for (index,time) in enumerate(all_times):
         datalist[index].append(time.text)
    return datalist
def saveData(data, savepath):
    print("save....")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)
    for year,datalist in data.items():
        sheet = book.add_sheet(f'{year}', cell_overwrite_ok=True)
        col = ("文件名", "链接","文号")
        for i in range(0, 3):
            sheet.write(0, i, col[i])
        for i in range(0,len(datalist)):
            print("第%d条" % (i + 1))
            data = datalist[i]
            for j in range(0, 3):
                sheet.write(i + 1, j, data[j])
    book.save(savepath)
if __name__ == "__main__":
    main()
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 GPT 生成】

问题分析

根据提供的代码,问题可以分为两个部分:

  1. 网址加入年代会报错的问题:目前无法确定具体的报错信息,因此无法给出具体的解决方案。需要提供报错信息或详细描述报错现象,才能进一步分析和解决问题。

  2. 无法将不同年代的信息保存到不同的sheet中:根据代码,发现在每次保存数据的时候,都会创建一个新的Excel文件(即Workbook对象),并添加一个新的sheet。这导致每次保存时都会创建一个新的文件,而不是将数据保存到同一个文件的不同sheet中。

解决方案

  1. 网址加入年代报错的问题无法确定,需要提供更多的信息来进一步分析和解决问题。

  2. 将不同年代的信息保存到不同的sheet中的问题,可以通过以下步骤解决:

  3. main()函数中,创建一个新的Workbook对象,并在循环中使用同一个对象。

  4. 在每次保存数据之前,检查是否需要创建一个新的sheet。如果需要创建新的sheet,使用add_sheet()方法创建,并设置名称为对应的年份。
  5. 在每次保存数据时,使用创建的Workbook对象和对应的sheet进行操作。

修改后的代码如下:

import requests
from bs4 import BeautifulSoup
import xlwt
import time

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}

def main():
    keyword = "可再生能源"
    savepath = "政策分年份.xls"
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建 Workbook 对象
    for year in range(1995, 2004):
        sheet = book.add_sheet(str(year))  # 创建对应年份的 sheet
        datalist = searchlaw(keyword, year)
        saveData(datalist, sheet)
        time.sleep(10)
    book.save(savepath)  # 保存 Workbook 对象到文件中

def searchlaw(keyword, year):
    response = requests.get(
        f"http://law1.law-star.com/search?kw={keyword}&dbt=chl&dbt=lar&rjs5_11={year}&p=1",
        headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "lxml")
    all_titles = soup.findAll("h2")
    datalist = []
    for title in all_titles:
        data = []
        try:
            title_name = title.find("a")["title"]
            link = title.find("a")["href"]
            data.append(title_name)
            data.append(link)
            datalist.append(data)
        except:
            continue
    all_times = soup.find_all("p")
    for (index, time) in enumerate(all_times):
        datalist[index].append(time.text)
    return datalist

def saveData(datalist, sheet):
    print("save....")
    for row, data in enumerate(datalist):
        for col, value in enumerate(data):
            sheet.write(row, col, value)

if __name__ == '__main__':
    main()

修改后的代码保持了原有的逻辑,但更新了保存数据到不同sheet的方法。创建一个Workbook对象,然后在循环中使用同一个Workbook对象,为每个年份创建一个新的sheet,最后将Workbook对象保存到文件中。

希望这个解决方案对你有帮助。如果有任何疑问,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^