码迷,mamicode.com
首页 > 编程语言 > 详细

Python从零开始写爬虫-3 获取需要抓取的URLs

时间:2020-02-08 17:21:41      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:ref   pre   学习   小说   request   logs   dal   星空   获取   

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

标签:ref   pre   学习   小说   request   logs   dal   星空   获取   

原文地址:https://www.cnblogs.com/blogcyh/p/12283928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!