【Python 爬虫系列】从某网站下载小说《鬼吹灯》,正则解析html
import re
import urllib.request
import urllib.parse
import urllib.error as err
import time # 下载 seed_url 网页的源代码
def download(url, num_retries=2):
print('Downloading: ', url)
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) ' \
'AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/63.0.3239.132 Safari/537.36'
headers = {'User-Agent':user_agent}
request = urllib.request.Request(url, headers=headers)
try:
response_html = urllib.request.urlopen(request).read().decode('utf-8')
except err.URLError as e:
print('Download error', e.reason)
response_html = None
if num_retries > 0:
if hasattr(e, 'code') and 500 <= e.code < 600: #hasattr() 函数用于判断对象是否包含对应的属性。
# recursively retry 5xx HTTP errors 只有出现 5xx 错误码的时候,才执行重新下载程序。
download(url, num_retries-1)
return response_html # 获取 html 网页中所有的链接URL
def get_links(html):
"""Return a list of links from html
"""
# a regular expression to extract all links from the webpage
# re.IGNORECASE 让正则表达式忽略大小写,如[A-Z]也可以匹配小写字母了。
webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
# list of all links from the webpage
url_list = webpage_regex.findall(html)
with open('E:\list_test.txt','w') as f:
for each in url_list:
f.write(each+'\n')
return url_list # 找出我们需要的url列表(1、满足我们需要的url格式 2、不能存在重复的url)。
def link_crawler(seed_url, link_regex): html = download(seed_url)
url_list = get_links(html) # 获得seed_url下所有url
crawl_queue = [] # 爬行队列,存放去重后的url
# 判断是否满足格式,满足后再判断是否重复
for link in url_list:
# check if link matches expected regex
if re.search(link_regex, link):
# check if have already seen this link
if link not in crawl_queue:
crawl_queue.append(link)
#print(crawl_queue)
with open("E:\crawlerlist_test.txt",'w') as f:
for each in crawl_queue:
f.write(each+'\n')
return crawl_queue # 下载小说...
def download_stoy(crawl_list,header): # 创建文件流,将各个章节读入内存
with open('E:\盗墓test22.txt', 'w',encoding='utf-8') as f:
for each_url in crawl_list:
# 有的时候访问某个网页会一直得不到响应,程序就会卡到那里,我让他0.6秒后自动超时而抛出异常
while True:
try:
request = urllib.request.Request(url=each_url, headers=header)
with urllib.request.urlopen(request, timeout=0.6) as response:
html = response.read().decode('utf-8')
break
except:
# 对于抓取到的异常,让程序停止1.1秒,再循环重新访问这个链接,访问成功时退出循环
time.sleep(1.1) # 匹配文章标题
title_req = re.compile(r'<h1>(.+?)</h1>')
# 匹配文章内容,内容中有换行,所以使flags=re.S re.S表示跨行匹配
#content_req = re.compile(r'<div class ="content-body">(.+)</div>', re.S)
content_req = re.compile(r'<p>(.*?)</p>', re.S)
# 获取标题
title = title_req.findall(html)[0]
# 获取内容
content_test = content_req.findall(html)
print('抓取章节>' + title)
f.write(title + '\n')
#print(content_test)
for each in content_test:
# 筛除不需要的的html元素
str1 = each.replace('“', ' ')
str2 = str1.replace('…', ' ')
str3 = str2.replace('”',' ')
f.write(str3 + '\n') seed_url = "http://seputu.com/"
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) ' \
'AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/63.0.3239.132 Safari/537.36'
headers = {'User-Agent': user_agent}
#link_regex = '/index|biji1|zanghaihua|hesui|daomubijichongqi'
link_regex = '.html'
link_crawler = link_crawler(seed_url=seed_url, link_regex=link_regex)
download_stoy(link_crawler, header=headers)
【总结】
- 使用正则解析HTML比较繁琐,以上代码时为了练习正则所以使用正则来解析html,更建议使用专门的库;
- 出于模块化思想,所以把下载网页、获取网页中全部的链接、找出我们需要的链接、以及下载小说用不同的方法来编写;
- 编写过程中报了很多错,其中最棘手的还是怎么用正则解析html的标签,最后取了一个巧。所以其实不算真正的解决这个问题,因为这个方法局限性比较大。
- 如果只是使用文章中提到的小说网站,只需要修改 文件保存名称 (E:\filename.txt)和【seed_url】即可。
【扩展】
互联网工程任务小组(英语:Internet Engineering Task Force,缩写为 IETF),定义了HTTP错误的完整列表,比如:
- 4XX 问题是客户端出现的问题;
- 5XX 问题是服务器出现了问题;
- 1XX 是消息;
- 2XX 是成功;
- 3XX 是重定向。
【Python 爬虫系列】从某网站下载小说《鬼吹灯》,正则解析html的更多相关文章
- python爬虫之小说网站--下载小说(正则表达式)
		python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ... 
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器      同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
		本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ... 
- Python 爬虫十六式 - 第七式:正则的艺术
		RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽 Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ... 
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
		本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ... 
- python爬虫系列(2)—— requests和BeautifulSoup
		本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ... 
- python爬虫系列序
		关于爬虫的了解,始于看到这篇分析从数据角度解析福州美食,和上份工作中的短暂参与. 长长短短持续近一年的时间,对其态度越来越明晰,噢原来这就是我想从事的工作. 于是想要系统学习的心理便弥散开来…… 参考 ... 
- 爬虫系列:连接网站与解析 HTML
		这篇文章是爬虫系列第三期,讲解使用 Python 连接到网站,并使用 BeautifulSoup 解析 HTML 页面. 在 Python 中我们使用 requests 库来访问目标网站,使用 Bea ... 
- 如何用Python爬虫实现百度图片自动下载?
		Github:https://github.com/nnngu/LearningNotes 制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或 ... 
- python 爬虫系列教程方法总结及推荐
		爬虫,是我学习的比较多的,也是比较了解的.打算写一个系列教程,网上搜罗一下,感觉别人写的已经很好了,我没必要重复造轮子了. 爬虫不过就是访问一个页面然后用一些匹配方式把自己需要的东西摘出来. 而访问页 ... 
随机推荐
- PHP开发工程师-技能树
			参考进阶-PHP程序员的技术成长规划-http://blog.csdn.net/heiyeshuwu/article/details/40098043 LNMP / LAMP 环境搭建(单组件安装,非 ... 
- 如何将Mac系统OS X Yosemite装到外部磁盘?(转)
			有Mac用户想了解是否可以将 OS X Yosemite 装到替代的外部磁盘,答案是肯定的,有需求的用户,可以按照本篇教程逐步进行. 前面我已经写过一篇文章介绍了如何安装 OS X Yosemite ... 
- 【转】【WPF】WPF MVVM 简单实例
			1 新建WPF 应用程序WPFMVVMExample 程序结构如下图所示. 2 Model实现 在Model文件夹下新建业务类StudentModel(类文件StudentModel.cs),类的详细 ... 
- VIM的自动补全
			自动补全可以很好的提高输入的效率: 触发自动补全的方法总结: 可供弹出式菜单的使用的命令: 其它再补充: 
- [转]Android--多线程之Handler
			原文:http://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决 ... 
- e614. Setting the Initial Focused Component in a Window
			There is no straightforward way to set the initial focused component in a window. The typical method ... 
- android 解决输入法键盘遮盖布局问题
			/** * @param root 最外层布局,需要调整的布局 * @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToVie ... 
- 使用appledoc 生成技术API文档具体解释
			一. 首先安装 appledoc 第一步:使用终端命令进行下载安装 git clone git://github.com/tomaz/appledoc.git cd ./appledoc sudo s ... 
- 浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时
			今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许 ... 
- Winform控件学习笔记【第二天】——常用控件
			背景:期末考试刚过就感冒了,嗓子火辣辣的,好难受.但是一想起要学习总结就打起精神来了,Winform控件网上也没有多少使用教程,大部分都是自己在网上零零散散的学的,大部分用的熟了,不总结会很容易忘得. ... 
