整个过程
准备阶段
- 进入小说目录页,右键->“检查”,即可找到每一章节小说的URL。
- 随便选一章,查看其网页元素,可以找到存放小说内容的div的具体id。
- headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。加入请求头来伪装成浏览器,以便更好地获取数据。
查看headers:选择"Network",查看"Headers"中的"Request Headers",headers为"User-Agent"后面的内容。
url = '[所要爬取的小说目录url]'
headers = {'User-Agent':'[复制的headers]'}
- 获取目录界面的HTML代码
response = requests.get(url, timeout=10, headers=headers)
#解决中文乱码问题
html = response.text.encode("ISO-8859-1").decode("utf-8")
设置timeout是为了防止出现TimeoutError
- 获取各章节URL及章节名称
title='[小说名称]'#可以利用正则表达式从html元素中提取
fb = open('%s.txt' % title, 'w', encoding='utf-8')
dl = re.findall(r'<div class="row-c2">.*?</div>', html, re.S)[0]
chapter_info_list = re.findall(r'<a href="(.*?)">(.*?)</a>', dl)
re.findall()中参数re.S的意义
1.字符串变为(后面多加了2个b)
str = '''aabbab aabbaa bb'''
2.参数无re.S,没有把最后一个换行的aab算进来
print(re.findall(r'a.*?b',str)) #['aab', 'ab', 'aab']
3.参数有re.S,不会对\n进行中断
print(re.findall(r'a.*?b',str,re.S)) #['aab', 'ab', 'aab', 'aa\n b']
- 循环获取各章节内容
for chapter_info in chapter_info_list:
#将获取的URL和章节名称分别赋给对应变量
chapter_url, chapter_title = chapter_info
chapter_url = "[补全网址]%s " % chapter_url
chapter_url = chapter_url.replace(' ', '')
chapter_response = requests.get(chapter_url, headers=headers)
chapter_response.encoding = 'utf-8'
chapter_html = chapter_response.text
chapter_content = re.findall(r'<div id="data" class="row-c3">(.*?)</div>', chapter_html, re.S)[0]
#数据清洗,将多余的字符去掉
chapter_content = chapter_content.replace(' ', '')
chapter_content = chapter_content.replace('<br />', '')
chapter_content = chapter_content.replace('<p>', '')
chapter_content = chapter_content.replace('</p>', '')
chapter_content = chapter_content.replace('&t;', '')
#将章节名称和内容写入文件
fb.write(chapter_title)
fb.write('\n')
fb.write(chapter_content)
fb.write('\n')
#成功写入即输出相应URL和章节名称
print(chapter_url, chapter_title)
出现过的报错及解决方案
- TimeoutError: [WinError10060]由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败
设置timeout
- urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=‘translate.google.com’, port=443): M…
pip install -U "urllib3<1.25"
不足
执行过程速度较慢,多次出现假死现象,也出现TimeoutError,一遍遍改timeout的值,从5改到35,就很讷…百度之后没有找到特别理想的解决方案,或许下次可以尝试使用Scrapy框架。