想让大家帮我看看,爬虫时把网址加上年代筛选条件就会报错,这应该如何解决?还有就是为什么不能通过循环把不同年代的信息写进不同的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()
报错如下:
报错部分爬取的内容形式如下:
将网址修改为不包含年代筛选条件的网址后可以正常输出,但是在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()
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【以下回答由 GPT 生成】
根据提供的代码,问题可以分为两个部分:
网址加入年代会报错的问题:目前无法确定具体的报错信息,因此无法给出具体的解决方案。需要提供报错信息或详细描述报错现象,才能进一步分析和解决问题。
无法将不同年代的信息保存到不同的sheet中:根据代码,发现在每次保存数据的时候,都会创建一个新的Excel文件(即Workbook
对象),并添加一个新的sheet。这导致每次保存时都会创建一个新的文件,而不是将数据保存到同一个文件的不同sheet中。
网址加入年代报错的问题无法确定,需要提供更多的信息来进一步分析和解决问题。
将不同年代的信息保存到不同的sheet中的问题,可以通过以下步骤解决:
在main()
函数中,创建一个新的Workbook
对象,并在循环中使用同一个对象。
add_sheet()
方法创建,并设置名称为对应的年份。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对象保存到文件中。
希望这个解决方案对你有帮助。如果有任何疑问,请随时提问。
【相关推荐】