初次尝试利用Python爬取网站小说

整个过程

准备阶段
  1. 进入小说目录页,右键->“检查”,即可找到每一章节小说的URL。
    在这里插入图片描述
  2. 随便选一章,查看其网页元素,可以找到存放小说内容的div的具体id。
    [(img-XY0TboBo-1610010713080)(C:\Users\22730\AppData\Roaming\Typora\typora-user-images\image-20210107145622121.png)]
  3. 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('&nbsp;', '')
    chapter_content = chapter_content.replace('<br />', '')
    chapter_content = chapter_content.replace('<p>', '')
    chapter_content = chapter_content.replace('</p>', '')
    chapter_content = chapter_content.replace('&amp;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框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值