原代码:
import requests
import time
from lxml import etree
import random
from datetime import datetime
# 请求头
headers = {'user-agent': ' '}
# 设置url
url = 'https://www.cbaigui.com/'
i = 1
while True:
# 反馈信息
response = requests.get(url, headers=headers)
# 设置类型
response.encoding = 'utf8'
# 解析数据
html = etree.HTML(response.text)
# 提取名称列表、详情页面的url列表
names = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//text()')
# 去掉name列表中的空字符与换行符
names = [i.strip() for i in names if i.strip()]
# 详情页面的url列表
detail_urls = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//@href')
# 提取下一页url
next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]
# 遍历names,detail_url,获取页面url
for name, detail_url in zip(names, detail_urls):
# 反馈信息
response = requests.get(detail_url, headers=headers)
# 设置类型
response.encoding = 'utf8'
# 解析数据
html = etree.HTML(response.text)
# 提取描述内容
description = html.xpath('//*[@id="page"]/div/div[1]/div[2]/article/div/p/text()')
# 内容换行
description = '\n'.join(description)
# 写入文件
with open(f'cbaigui{datetime.now().strftime("%Y%m%d")}.txt', 'a', encoding='utf8') as f:
f.write(f'{i}、{name}\n{description}\n\n')
print(f'{i}、{name} 抓取成功')
i += 1
# 休眠间隔
time.sleep(random.randint(1, 3))
url = next_url
提取下一页url 的代码在写入文件之前
# 提取下一页url
next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]
原代码存在 爬取最后一页时 运行到提取下一页url的代码会报错,导致最后一页无法写入文件
所以我想把提取下一页url放在写入文件之后,实现即使报错,最后一页也已经爬取完毕,如下:
import requests
import time
from lxml import etree
import random
from datetime import datetime
# 请求头
headers = {'user-agent': ' '}
# 设置url
url = 'https://www.cbaigui.com/'
i = 1
while True:
# 反馈信息
response = requests.get(url, headers=headers)
# 设置类型
response.encoding = 'utf8'
# 解析数据
html = etree.HTML(response.text)
# 提取名称列表、详情页面的url列表
names = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//text()')
# 去掉name列表中的空字符与换行符
names = [i.strip() for i in names if i.strip()]
# 详情页面的url列表
detail_urls = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//@href')
# 遍历names,detail_url,获取页面url
for name, detail_url in zip(names, detail_urls):
# 反馈信息
response = requests.get(detail_url, headers=headers)
# 设置类型
response.encoding = 'utf8'
# 解析数据
html = etree.HTML(response.text)
# 提取描述内容
description = html.xpath('//*[@id="page"]/div/div[1]/div[2]/article/div/p/text()')
# 内容换行
description = '\n'.join(description)
# 写入文件
with open(f'cbaigui{datetime.now().strftime("%Y%m%d")}.txt', 'a', encoding='utf8') as f:
f.write(f'{i}、{name}\n{description}\n\n')
print(f'{i}、{name} 抓取成功')
i += 1
# 休眠间隔
time.sleep(random.randint(1, 3))
# 提取下一页url
next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]
url = next_url
但是运行到 提取下一页url这一行就会报错:IndexError: list index out of range
IndexError: list index out of range通常有两种情况
一个可能是下标超出范围,
一个可能是list是空的,没有一个元素
但我调试不出具体原因