【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 爬虫系列教程方法总结及推荐
爬虫,是我学习的比较多的,也是比较了解的.打算写一个系列教程,网上搜罗一下,感觉别人写的已经很好了,我没必要重复造轮子了. 爬虫不过就是访问一个页面然后用一些匹配方式把自己需要的东西摘出来. 而访问页 ...
随机推荐
- java对mongoDB的基本操作 ,游标使用
package com.mongodb.text; import java.net.UnknownHostException; import java.util.List; import org.bs ...
- SpringMVC深度探险(三) —— DispatcherServlet与初始化主线
在上一篇文章中,我们给出了构成SpringMVC应用程序的三要素以及三要素的设计过程.让我们来归纳一下整个设计过程中的一些要点: SpringMVC将Http处理流程抽象为一个又一个处理单元 Spri ...
- Hadoop HDFS分布式文件系统 常用命令汇总
引言:我们维护hadoop系统的时候,必不可少需要对HDFS分布式文件系统做操作,例如拷贝一个文件/目录,查看HDFS文件系统目录下的内容,删除HDFS文件系统中的内容(文件/目录),还有HDFS管理 ...
- 表格细边框的两种CSS实现方法
在网页制作中,细边框这个制作方法是必不可少的.这里介绍2种常见的表格细边框制作方法,均通过XHTML验证. <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- Opengl绘制我们的小屋(一)球体,立方体绘制
这个系列我想用来运用opengl红皮书的前八章节的内容,来打造一个室内小屋. 这一章主要是定义几个基本的结构.并给出球体与立方体的画法,先让我们来定义一些基本的结构.一个是包含点,法向量,纹理贴图向量 ...
- Wifi 评分机制分析
从android N开始,引入了wifi评分机制,选择wifi的时候会通过评分来选择. android O源码 frameworks\opt\net\wifi\service\java\com\and ...
- android 拍照声音文件路径
Android拍照音频文件位于\frameworks\base\data\sounds\effects目录,更具不同的平台区分不同音频文件. 例如拍照声音文件位于\frameworks\base\da ...
- MongoDB mongod.exe或mongo.exe双击一闪就关闭
场景: 在 D:\data\ 创建 db目录之后,运行 mongod -repair 原因: 磁盘满了,没有空间了. 解决方法: 把 MongoDB\data 下的 lock 文件删掉,清理下磁盘空间 ...
- C#提供-------AttributeUsage使用
Assembly(c#中简单说明) Assembly(c#中简单说明) 2008-07-11 00:27 什么是Assembly(程序集)?Assembly是一个包含来程序的名称,版本号,自我描述,文 ...
- C#跳转网页7种方法
1.Response.Redirect(http://www.baidu.com,false); 目标页面和原页面可以在2个服务器上,可输入网址或相对路径.后面的bool值为是否停止执行当前页. 跳转 ...