脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python利用多线程+队列技术爬取中介网互联网网站排行榜

python利用多线程+队列技术爬取中介网互联网网站排行榜

2023-02-06 11:13梦想橡皮擦 Python

这篇文章主要介绍了python利用多线程+队列技术爬取中介网互联网网站排行榜,文章基于python的相关内容展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下

目标站点分析

本次要抓取的目标站点为:中介网,这个网站提供了网站排行榜、互联网网站排行榜、中文网站排行榜等数据。

网站展示的样本数据量是 :58341。

采集页面地址为https://www.zhongjie.com/top/rank_all_1.html,

UI如下所示:

python利用多线程+队列技术爬取中介网互联网网站排行榜

由于页面存在一个【尾页】超链接,所以直接通过该超链接获取累计页面即可。

其余页面遵循简单分页规则:

https://www.zhongjie.com/top/rank_all_1.html
https://www.zhongjie.com/top/rank_all_2.html

基于此,本次Python爬虫的解决方案如下,页面请求使用requests库,页面解析使用lxml,多线程使用threading模块,队列依旧采用queue模块。

 

编码时间

在正式编码前,先通过一张图将逻辑进行梳理。

本爬虫编写步骤文字描述如下:

  • 预先请求第一页,解析出总页码;
  • 通过生产者不断获取域名详情页地址,添加到队列中;
  • 消费者函数从队列获取详情页地址,解析目标数据。

python利用多线程+队列技术爬取中介网互联网网站排行榜

总页码的生成代码非常简单

def get_total_page():
	# get_headers() 函数,可参考开源代码分享数据
  res = requests.get(
      'https://www.zhongjie.com/top/rank_all_1.html', headers=get_headers(), timeout=5)
  element = etree.HTML(res.text)
  last_page = element.xpath("//a[@class='weiye']/@href")[0]
  pattern = re.compile('(\d+)')
  page = pattern.search(last_page)
  return int(page.group(1))

总页码生成完毕,就可以进行多线程相关编码,本案例未编写存储部分代码,留给你自行完成啦,

完整代码如下所示:

from queue import Queue
import time
import threading
import requests
from lxml import etree
import random
import re
def get_headers():
  uas = [
      "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
      "Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)"
  ]
  ua = random.choice(uas)
  headers = {
      "user-agent": ua
  }
  return headers


def get_total_page():
  res = requests.get(
      'https://www.zhongjie.com/top/rank_all_1.html', headers=get_headers(), timeout=5)
  element = etree.HTML(res.text)
  last_page = element.xpath("//a[@class='weiye']/@href")[0]
  pattern = re.compile('(\d+)')
  page = pattern.search(last_page)
  return int(page.group(1))
# 生产者
def producer():
  while True:
      # 取一个分类ID
      url = urls.get()
      urls.task_done()
      if url is None:
          break
      res = requests.get(url=url, headers=get_headers(), timeout=5)
      text = res.text
      element = etree.HTML(text)
      links = element.xpath('//a[@class="copyright_title"]/@href')
      for i in links:
          wait_list_urls.put("https://www.zhongjie.com" + i)
# 消费者
def consumer():
  while True:
      url = wait_list_urls.get()
      wait_list_urls.task_done()
      if url is None:
          break
      res = requests.get(url=url, headers=get_headers(), timeout=5)
      text = res.text
      element = etree.HTML(text)
		# 数据提取,更多数据提取,可自行编写 xpath      link = element.xpath('//div[@class="info-head-l"]/p[1]/a/text()')
      description = element.xpath('//div[@class="info-head-l"]/p[2]/text()')
      print(title, link, description)
if __name__ == "__main__":
  # 初始化一个队列
  urls = Queue(maxsize=0)
  last_page = get_total_page()
  for p in range(1, last_page + 1):
      urls.put(f"https://www.zhongjie.com/top/rank_all_{p}.html")
  wait_list_urls = Queue(maxsize=0)
  # 开启2个生产者线程
  for p_in in range(1, 3):
      p = threading.Thread(target=producer)
      p.start()
  # 开启2个消费者线程
  for p_in in range(1, 2):
      p = threading.Thread(target=consumer)
      p.start()

到此这篇关于python利用多线程+队列技术爬取中介网互联网网站排行榜的文章就介绍到这了,更多相关python爬取网站排行榜内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7079964924385968135

延伸 · 阅读

精彩推荐
  • Pythonpython实习总结(yeild,async,azwait和协程)

    python实习总结(yeild,async,azwait和协程)

    今天是Python实习的第一天,熟悉了环境,第一次使用macbook,氛围还不错,努力学习新知识,希望本片文章能给你带来帮助...

    ==今天写代码了吗6822022-01-19
  • Python在python tkinter中Canvas实现进度条显示的方法

    在python tkinter中Canvas实现进度条显示的方法

    今天小编就为大家分享一篇在python tkinter中Canvas实现进度条显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    阿_波_7572021-07-12
  • Pythonpython 实现UTC时间加减的方法

    python 实现UTC时间加减的方法

    今天小编就为大家分享一篇python 实现UTC时间加减的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    雲恸7782021-05-10
  • PythonPython 访问限制 private public的详细介绍

    Python 访问限制 private public的详细介绍

    在一个模块中,我们可能会定义很多函数和变量。这篇文章主要介绍了Python 访问限制 private public的详细介绍,小编觉得挺不错的,现在分享给大家,也给大...

    unpredictable_X4642021-04-08
  • Pythonmac安装python3后使用pip和pip3的区别说明

    mac安装python3后使用pip和pip3的区别说明

    这篇文章主要介绍了mac安装python3后使用pip和pip3的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    阿术和薇薇安7262020-09-02
  • PythonPython使用tkinter实现小时钟效果

    Python使用tkinter实现小时钟效果

    这篇文章主要为大家详细介绍了Python使用tkinter实现小时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    chaodaibing6832021-09-08
  • Pythonpython实现的简单窗口倒计时界面实例

    python实现的简单窗口倒计时界面实例

    这篇文章主要介绍了python实现的简单窗口倒计时界面,实例分析了Python基于Tkinter操作windows窗口界面的相关技巧,非常具有实用价值,需要的朋友可以参考下...

    work2414352020-06-22
  • Python一文总结学习Python的14张思维导图

    一文总结学习Python的14张思维导图

    一文总结学习Python的14张思维导图,本文涵盖了Python编程的核心知识,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    艺术攻城狮5512020-12-12