首页 > 编程语言 >Python 爬虫2例:爬网络小说

Python 爬虫2例:爬网络小说

时间:2022-11-23 19:37:12浏览次数:44  
标签:章节 Python URL 爬虫 content url html 网络小说 print


程序逻辑:按给出的第一章节URL,抓HTML,然后通过正则表达式,取出小说章节的 标题、正文、下章节的URL, 然后跳转到下一章节,不断循环处理。 取出的正文写入文本文件。 同时记录每次取过的URL,如果网络异常了,重启程序,可以从文件中取URL继续上次的抓取任务。

正则,对应如下图:

Python 爬虫2例:爬网络小说_正则表达式

代码: ​​

#!/usr/bin/python
# -*- coding: gbk -*-

# by gnolux 20190526
# email: [email protected]

from urllib import request
import re
import os
import socket

#socket.setdefaulttimeout(60)

#第一章节的URL
url = 'https://www.23us.la/html/203/203086/1130014.html'
#URL前辍,用来拼接出下章节的绝对URL用
url_prex = 'https://www.23us.la/html/203/203086/'

#取章节标题的正则表达式
title_match_str = r'<h1>(.*?)</h1>'
#取章节正文的正则表达式
content_match_str = r'<div id="content">(.*?)</div>'
#取下一章节URL的正则表达式(相对URL)
next_page_match_str = r'<div class="link">.*?返回列表</a>→<a href="(.*?)">下一章</a>'

#保存的文件名
save_file = 'd:/test/tclys.txt'



#如果已经运行过,则记录了最后一次运行的下一面地址,从文件中取url
last_url_file = '%s.url.txt'%save_file
if os.path.isfile(last_url_file):
with open(last_url_file, 'r') as f:
url = f.read()

headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}
#print(url)
for page in range(0,99999999):
req=request.Request(url=url,headers=headers)
url = ''
#如果timeout尝试重新提交,最多尝试8次
for t in range(0,8):
try:
response = request.urlopen(req,timeout=4)
html = response.read()
#print(html)
html = html.decode("utf-8")
title,content= '',''

s=re.findall(title_match_str,html,re.S)
if len(s) == 1:
title=s[0]
s=re.findall(content_match_str,html,re.S)
if len(s) == 1:
content = s[0]
content=content.replace('<br/>','').replace(' ','').replace('<br />','')

#print(title,content)

with open(save_file, 'a',encoding='utf-8') as f:
f.write("%s\n%s\n"%(title,content))

s=re.findall(next_page_match_str,html,re.S)
if len(s) == 1:
url = '%s%s'%(url_prex,s[0])
else:
print(s)

#记录下一章地址到文件,出现网络异常时,可以续传
with open(last_url_file, 'w') as f:
f.write(url)

#print('next url:%s'%url)
print(title)
#print(content)

break;#成功则跳出重试。

except Exception as e: #抛出超时异常
print('第%d次尝试连接'%t, str(e))
if url == '':
break;


标签:章节,Python,URL,爬虫,content,url,html,网络小说,print
From: https://blog.51cto.com/fangkailove/5881712

相关文章

  • Python 爬虫:喜马拉雅FM音频(这个还能不载,试了一下其它下载工具都不行了)
    现在是3:35分,花了整晚时间,写了个喜马拉雅FM音频爬虫,顺便熟悉了一下tkinterGUI效果图:已打包的工具可以在下面下载:链接:​​https://pan.baidu.com/s/1jJ50I4vlJyRtVFXR......
  • python 爬虫 试了五种爬喜马的方法并做了测试代码(爬虫系列研究告一段落了...)
    先介绍一下我想到和测试了的五种方法: 方法1,使用下面接口:    通过web_api'http://m.ximalaya.com/m-revision/page/album/queryAlbumPage/%s?pageSize=1000'%al......
  • Python 处理输入法字库(五笔极点字库转小鸭字库)
    一直都是用的小鸭五笔,091新字库是极点格式的,刚开始懒得动,直接用极点五笔了,用了一段时间碰到很多问题.其中最坑的是.在tkinterGui里极点输入不能退格,一退格就乱码( ......
  • Python 统计学生总分
    输入学生的学号、姓名以及语文、数学、外语成绩,统计每个学生的总分,并按总分升序输出所有学生的学号、姓名和总分。输入格式:输入若干行数据,每一行数据分别为学号、姓名以......
  • vim-python全能补全与python环境变量设置
    vim针对python的万能补全对于python自带的模块库都能够正常使用全能补全,但一些自定义的模块却不行,这是因为vim当前进程需要找到相应模块并做导入分析获取补全用的词......
  • Python的GET和POST请求
    引入requests包注:发送请求(包括请求行、方法类型、头、体)&常见的请求方式有get、post、put、delete一、发送get请求格式:requests.get()(内容:url必填;params选填:u......
  • 6. python和Redis交互
    1安装包pipinstallredis2引入模块fromredisimport*这个模块中提供了StrictRedis对象(Strict严格),用于连接redis服务器,并按照不同类型提供了不同方法,进行交互操作......
  • Python 性能检测分析方法 - 时间、空间衡量方法
    性能检测分析方法-时间、空间衡量方法Python自带模块importtime点击查看代码#仅仅是示范time模块的用法,此段不能直接运行,运行请看测试项目源码importtime......
  • python四十期--mysql
    昨日内容回顾存取数据演变史1.文本文件2.目录规范3.数据库ps:数据处理统一数据库应用史1.本地存储2.网络存储ps:数据库集群数据库本质数据库在不同的场......
  • python爬取房产信息(仅供学习使用)
    importrequestsfrombs4importBeautifulSoupimporttimeimportopenpyxldefwrite_mysql(lst):wk=openpyxl.Workbook()sheet=wk.activeforiinlst:......