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('&ldquo;', ' ')
str2 = str1.replace('&hellip;', ' ')
str3 = str2.replace('&rdquo;',' ')
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的更多相关文章

  1. python爬虫之小说网站--下载小说(正则表达式)

    python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...

  2. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  3. Python 爬虫十六式 - 第七式:正则的艺术

    RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...

  4. $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法

    本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...

  5. python爬虫系列(2)—— requests和BeautifulSoup

    本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...

  6. python爬虫系列序

    关于爬虫的了解,始于看到这篇分析从数据角度解析福州美食,和上份工作中的短暂参与. 长长短短持续近一年的时间,对其态度越来越明晰,噢原来这就是我想从事的工作. 于是想要系统学习的心理便弥散开来…… 参考 ...

  7. 爬虫系列:连接网站与解析 HTML

    这篇文章是爬虫系列第三期,讲解使用 Python 连接到网站,并使用 BeautifulSoup 解析 HTML 页面. 在 Python 中我们使用 requests 库来访问目标网站,使用 Bea ...

  8. 如何用Python爬虫实现百度图片自动下载?

    Github:https://github.com/nnngu/LearningNotes 制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或 ...

  9. python 爬虫系列教程方法总结及推荐

    爬虫,是我学习的比较多的,也是比较了解的.打算写一个系列教程,网上搜罗一下,感觉别人写的已经很好了,我没必要重复造轮子了. 爬虫不过就是访问一个页面然后用一些匹配方式把自己需要的东西摘出来. 而访问页 ...

随机推荐

  1. 2012Google校园招聘笔试题

    1.已知两个数字为1~30之间的数字,甲知道两数之和,乙知道两数之积,甲问乙:“你知道是哪两个数吗?”乙说:“不知道”.乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”.于是,乙说:“那我知道了”, ...

  2. 微信小程序 --- e.currentTarget.dataset.id 获取不到值

    直接代码 wxml代码片段 <view class='ranksList' wx:for="{{ranksLb}}"> <view class='ranksLis ...

  3. 构建Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...

  4. ASP.NET中使用JavaScript实现图片自动水平滚动效果

    参照网上的资料,在ASP.NET中使用JavaScript实现图片自动水平滚动效果. 1.页面前台代码: <%@ Page Language="C#" AutoEventWi ...

  5. C/C++文件输入输出操作——FILE*、fstream、windowsAPI

    基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio. ...

  6. ORACLE 数据库优化原则

    ORACLE 数据库优化原则 一.SQL语句用大写的: 因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再厉行. 二.避免在索引列上利用NOT等闲 我们要避免在索引列上利用NOT, NO ...

  7. python的callback函数原理

    __getattribute__作用 """ class C(object): a = 'abc' def __getattribute__(self, *args, * ...

  8. android O 蓝牙设备默认名称更改

    安卓系统会首先读取BTM_DEF_LOCAL_NAME的值,如果为空,就使用"ro.product.model"作为蓝牙设备名. system/bt/btif/src/btif_d ...

  9. 解决maven jmxtools 缺失的问题

    原因:有版权,所以maven仓库基本都下架了jmxtool. 目前可用的,我就找到了wso2这家,配置如下: <project xmlns="http://maven.apache.o ...

  10. 正则表达式-----------------------------------C#的正则表达式

    为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时能一目了然知道他的使用,为开发节约时间,同时也分享给大家 正则元字符 在说正则表达式之前我们先来看看通配符,我 ...