首页 > 编程语言 >Python爬虫之循环爬取多个网页

Python爬虫之循环爬取多个网页

时间:2023-04-12 11:01:33浏览次数:33  
标签:.__ set 读取 Python self 爬虫 爬取 url href

之前的文中介绍了如何获取给定网址的网页信息,并解析其中的内容。本篇将更进一步,根据给定网址获取并解析给定网址及其相关联网址中的内容。要实现这些功能,我们需要解决以下问题:

1、如何持续不断的获取 url,并读取相关内容。

2、如何判断网址是否已经读取过。

文中用到的代码均已上传到 github,在这里就不再贴出完整的代码了。

如何持续不断的获取网址,并读取相关内容?

要想读取网页内容,首先要获取网页的 url,但是我们又不能将所有的 url 都输入到程序中,此时就需要我们从已知的 url 中解析出其他的 url,从而不间断的获取新的 url读取新的内容,获取新的 url 可以通过解析含有 href 属性的 a 标签来实现,具体代码如下:

for link in html.find_all(name='a', href=re.compile(r'https?://list|item.szlcsc.+')):
    if len(self.__url_set) > self.__max_url_count:
        return
    url = link.get('href')

以上代码解析出所有的 a 标签中的 href 属性内容以 https://list.szlcsc 和 https://item.szlcsc为开头的 url 连接。在这里还是设置了一个最大的 url 解析量「由于在测试中需要一个停止条件」,默认值为1000。

从一个 url 中获取到更多的 url 后,我们该怎么去读取?以什么顺序去读取?不可能获取一个 url 就读取一个 url,此时就需要一个保存 url 的地方「最好是可以顺序保存顺序取出的」,那么最好的方法就是使用队列了,以下是将 url 放入队列的代码:

for link in html.find_all(name='a', href=re.compile(r'https?://list|item.szlcsc.+')):
    if len(self.__url_set) > self.__max_url_count:
        return
    url = link.get('href')
    if url not in self.__url_set:
        self.__url_set.add(url)
        self.__url_queue.put(url)

以下是从队列中取出 url 的代码:

while not self.__url_queue.empty():
    count = count + 1
    url = self.__url_queue.get()
    result = self.get_html(url)

以上两段代码完成了一个 url 从存入队列到从队列中出的全过程。

如何判断网址是否已经读取过?

这个问题实际上就是 url 去重的问题,常用的 url 去重的方法主要有以下几种:

1、url 保存在数据库中(效率较低)

2、将 url 保存到集合中,利用集合的无重复元素的特性来去重,缺点是占用空间大。

3、将 url 通过 md5 等哈希算法后保存在集合中,与第 2 项相比可以大幅度提高空间利用率。

4、使用布隆过滤器「Bloom Filter」,在时间和空间方面有巨大的优势,但是存在一定的误算率,不适用于高准确度的场合。

本篇我们使用集合来对 url 进行去重,其他方法大家可以自行搜索一下,网上有很多这方面的资料。

集合中的元素无次序,且不可重复。元素不可重复的特性用来对 url 去重在合适不过了,通过判断 url 是否已经在集合中可以快速判断该 url 是否已经读取过。具体看以下代码:

if url not in self.__url_set:
    self.__url_set.add(url)
    self.__url_queue.put(url)

以上代码首先判断 url 是否存在于 _urlset 中,如果不存在则将该 url 添加到 _urlset 中,同时将次 url 放入读取队列中进行读取。这样既对得到的每个 url 进行读取,又避免了多次读取同一个 url 造成资源的浪费。

标签:.__,set,读取,Python,self,爬虫,爬取,url,href
From: https://www.cnblogs.com/q-q56731526/p/17309069.html

相关文章

  • linux安装两个python版本
    1.下载python3安装包wgethttps://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz2.解压python的tgz压缩包文件tar-xzvfPython-3.7.2.tgz3.进入解压的文件cdPython-3.7.24.在python文件路径下编译pythonprefix=/usr/local/python37,指定python安装路径,这个路径......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-场景问题智能生成从0到1快速入门——官网推荐
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能多功能学习机从0到1快速入门——官网推荐
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能评论创建从0到1快速入门——官网推荐的48
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • Python Tkinter Frame
    PythonTkinterFrametkinter的Frame组件:这个组件是容器组件,用于在复杂布局中将其他的组件分组。所谓容器组件,就是可以收纳其它组件,可以做其它组件的父组件的组件。frame的属性:bg或background : frame组件的背景颜色bd或borderwidth : frame的边框宽度,默认值......
  • python搭建私有pypi源
    #不带密码认证的dockerrun--namepypi--restartalways-p8080:8080-dpypiserver/pypiserver-P.-a.#带密码认证的dockerrun--namepypi--restartalways-v.htpasswd:/data/.htpasswd-p8080:8080-dpypiserver/pypiserver-P.htpasswd#无需检验......
  • python 开数组
     列表推导式~N=int(10)#二维数组a=[[jforiinrange(N)]forjinrange(20)]a[1][1]=8a[1][2]=2foriinrange(N):forjinrange(N):print(a[i][j],end='')print('')#多维数组a=[[[iforjinrange(N)]forkinrange(3)]......
  • Python爬图片(面向对象版)
    importrequestsfromlxmlimportetreefromthreadingimportThreadclassSpider(object):def__init__(self):self.header={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chro......
  • python习题-排列组合序列
    【题目描述】用户输入整数n(1<=n<=26)和整数m(m<=n),然后输入n个不同的字母,请编写程序输出在这n个字母中选择m个字母的所有排列序列和组合序列。【源代码程序】importitertools#输入整数n和mn=int(input("请输入整数n(1<=n<=26):"))m=int(input("请输入整数m(m<=n):"))#输入......
  • Python爬图片
    1importrequests2fromlxmlimportetree34header={5"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/112.0.0.0Safari/537.36"6}789defspider(page_num):......