这次我们爬取斗破苍穹http://www.doupoxs.com/doupocangqiong/的全部文字,并保存到本地TXT。
话不多说,上代码:
#导入requests库
import requests
#导入 re 库
#导入时间模块
import time
import re
#定义请求头,请求头可以使爬虫伪装成浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
#定义连接网络的列表
url_list = ['http://www.doupoxs.com/doupocangqiong/{}.html'.format(str(i)) for i in range(2,1665) ]
#函数主体
with open('F:/exercise/斗破苍穹.txt', 'w') as f:
for url in url_list:
html = requests.get(url, headers = headers)
#如果status_code = 200, 说明网页相应成功
if html.status_code == 200:
#利用正则表达式获取内容
contents = re.findall('<p>(.*?)</p>', html.content.decode('utf-8'), re.S)
#将内容写入到本地txt文档
f.write('\n\n')
for content in contents:
f.write(content+'\n')
else:
pass
time.sleep(0.5)
首先我们要做的,依旧是观察目标网页的URL,斗破苍穹第一页http://www.doupoxs.com/doupocangqiong/2.html,第二页为
http://www.doupoxs.com/doupocangqiong/5.html,第三页为http://www.doupoxs.com/doupocangqiong/6.html,第四页为http://www.doupoxs.com/doupocangqiong/7.html。经过分析,第一页与第二页没有明显的规律,但是第二页往后规律就很明显了。我们依然可以构造网页http://www.doupoxs.com/doupocangqiong/{0}.html样式的url列表,但是 {} 里面为3,4的时候网页出现404,这该怎么办?这就需要我们来判断返回的status_cord了,如果返回200,则说明连接成功,否则相应失败。
现在来分析代码:
1.导入requests库、time模块、re 模块、定义请求头
2.构造ur连接列表http://www.doupoxs.com/doupocangqiong/ { }.html 区间为[2,1665) 左闭右开,其中3,4网页为404
3.在本地创建一个TXT文件,命名为 ”斗破苍穹.txt“ 。利用with 语句来进行文件的 写 操作。
3.1利用 with 语句 打开 open 路径为 “F:/exercise/斗破苍穹.txt”的文件,“w”为写操作。
3.2利用 for 循环读入 URL ,利用requests读取网页内容
3.3.判断是否成功连接网页,如果成功连接网页则:
3.3.1利用正则表达式获取文章内容。注意,我们获得的是非utf-8编码,因此在这里我们多了一个步骤,就是将获取到的内容转换为utf-8编码。你可以将 html.content.decode('utf-8) 更换为 html.text 打印一小部分内容观察一下。
3.3.2在文本写入两行空格,用来区分章节。
3.3.3循环读入获取到的内容,将其写入文本中
3.4如果连接失败,那么就pass吊此次循环,进入下一个循环。
3.5让程序休息0.5秒,防止一直在运行,频率过高从而导致爬虫失败。
文件操作:
打开文件进行操作之后需要将打开的文件关闭。否则会一直占用资源。但有时程序出现问题,导致打开的文件不能正常关闭,所以我们会用 try... finally来进行文件的操作。但是这样未免显得繁琐。所以 Python引入了 with 语句来自动关闭 close 文件。用法是 with open(“path”,‘identifier’)as f 其中path指的是文件的路径,包括文件名;‘identifier’ 是标识符,表示的是对文件进行何种操作: ‘r' 表示读文件: ’w' 表示写文件: ‘rb’ 表示读取二进制文件(比如图片,视频等)。
下图为成功读取保存的《斗破苍穹》文本文档: