python爬虫爬小说时,爬了一百多张就会报错,从新启动后爬取速度变慢了
以下是全部代码
import requests
from lxml import etree
import time
from random import randint as rd
bookpath = r"books/"
bookname = "超级作死宝箱系统3"
bookurl = "http://www.777zw.net/30/30031/"
weburl = "http://www.777zw.net/30/30031/"
user_agent= "Mozilla/5.0 (Windows NT 5.1; WOW64) AppleWebKit/561.3 (KHTML, like Gecko) Chrome/21.0.1262.89 Safari/561.3"
headers = {
"Referer": bookurl,
"User-Agent": user_agent,
'Connection': 'close'
}
requests.DEFAULT_RETRIES = 20
s = requests.session()
s.keep_alive = False
def get_urls():
url = bookurl
response = requests.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
html = etree.HTML(response.text)
# 所有章节的url列表
url_list = [weburl + x for x in html.xpath('//li[@class="book-item"]/a/@href')]
print(f'{len(url_list)}')
return url_list
def get_text(url):
rep = requests.get(url, headers=headers, verify=False)
rep.encoding = 'utf-8'
dom = etree.HTML(rep.text)
# 获取章节名weixin_38616018
name = dom.xpath('//h1[@class="title"]/text()')[0]
#获取章节内小说
text = dom.xpath('//div[@id="content"][@class="content"]/p/text()')
#写入txt文档
with open(bookpath + bookname + '.txt', mode='a', encoding='utf-8') as f:
f.write('\n'+ name + '\n')
for con in text:
f.write(' ' + con + '\n')
print(f'{name} ===> 下载完成')
def main():
urls = get_urls()
for url in urls:
get_text(url)
# 随机时间
c = rd(1000, 3000) / 1000
print(c)
time.sleep(c)
if name == 'main':
main()
基本会报错Max retries exceeded with url,有多次直接停止不动(不报错),加了timeout = 60 后就会报时间过长
尝试过random请求头,效果并不理想。每次重新启动有时能跑起来,有时直接停止不动。
我想要能一次性下载完
这种情况应该是网站服务器设置了反爬
time.sleep(c)时间设置的长一些, 或者找个代理ip的ip池,每次换不同的ip代理
爬了一百多张就会报错?
emmm,那你设置一下代理呢
爬取100多张报错的原因是什么,有可能是被反爬了
重新启动程序变慢的原因是这:
with open(bookpath + bookname + '.txt', mode='a', encoding='utf-8') as f:
这里采用的a追加模式,已经爬取了的小说重新运行的话,会在原来文件基础上追加内容,这里读取和写入都增加了耗时,可能会导致程序变慢,改为 w 模式的话应该能解决变慢的问题
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!