Python从零开始写爬虫-3 获取需要抓取的URLs
Posted blogcyh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python从零开始写爬虫-3 获取需要抓取的URLs相关的知识,希望对你有一定的参考价值。
Python从零开始写爬虫-3 获取需要抓取的URLs
??在一节中,我们学习了如果通过正则表达式来获取HTML里面指点便签的内容, 那么我今天就来看看实际的效果.在抓取小说之前, 我们需要知道小说有哪些章节,以及这些章节的顺序.
??刚开始我是通过获取一个章节, 然后从这个章节获取下个章节的链接, 然后发现这个方法问题很大.
- 该方法只能单线程操作, 对于抓取小说来非常的满, 几乎没有爬虫是单线程, 单线程的效率是无法被接受的.
- 鲁棒性差, 只要有一个章节没有正确的抓取下来, 那么整个程序就无法进行.
- 这样的做的好处, 可以保证章节的连续性.
后来发现我发现可以直接通过目录来获取全部章节的目录.话不多说,开始我们今天的任务, 获取URLs
首先通过第一节学习到内容, 获取小说的目录页.这里以小说吞噬星空为例.
import requests
r = requests.get('http://www.biquger.com/biquge/12928/')
r.encoding = 'utf-8'
print(r.text)
观察url的格式
通过观察下载的html源码, 可以发现, 所有的URL都以:
<dd><a href="http://www.biquger.com/biquge/12928/4282781" title="第一章 罗峰">第一章 罗峰</a></dd>
我们只需要获取所有和上述格式一样的内容即可
使用正则表达式获取上述格式内容
在第二节的学习中, 我们学习了获取全部链接应该使用re
中的findall(p, text)
来实现.
import re
res = re.findall('<dd><a href="(.*?)".*?>(.*?)</a></dd>', r.text)
for i in res:
print(i)
上述正则表达式<dd><a href="(.*?)".*?>(.*?)</a></dd>
中, 第一括号是为了提取网页的链接, 第二括号是为了提取标题., 这样一来我们就获得了, 所有章节的标题以及对应url, 下面我们将其输入为list, 以方便我们后面使用.
输入为列表
index, ans = 1, []
for i in res:
ans.append((i[0], str(index).zfill(4) + i[1]))
index = index + 1
print(ans[-1])
这样我们就获取到我们需要的url以及对应标题的列表了, 其中i[0]
为url, i[1]
为标题.很多人可能会有疑问, 为什么在标题前要加序号?标题是我们保存章节的文件名, 我们必须保证其有序性, 而序号就是起到这个作用.
整理成函数
到这里,今天的内容就学习完毕了, 下面把我们今天学到内容,整理成一个函数, 方便后面继续使用.
def getContents(url):
r = requests.get(url)
r.encoding = 'utf-8'
res = re.findall('<dd><a href="(.*?)".*?>(.*?)</a></dd>', r.text)
index, ans = 1, []
for i in res:
ans.append((i[0], str(index).zfill(4) + i[1]))
index = index + 1
return ans
以上是关于Python从零开始写爬虫-3 获取需要抓取的URLs的主要内容,如果未能解决你的问题,请参考以下文章
用python写网络爬虫 -从零开始 1 编写第一个网络爬虫