关于多线程爬取的加强练习

2023-11-05

多线程能够帮助我们提升爬取爬虫爬取的速度,上一篇文章我们也讲到了如何简单的使用多线程来爬取自己想要要去的东西,今天我们来加强以下 (●ˇ∀ˇ●)

今天我们的目标是多线程爬取股票网站的信息,并保存成文件,本次保存文件的格式为txt(各位想保存别的格式也可以哦)话不多说,我们来开始盘它
本次要爬的股票网站

分析:点击进去可以看到该网站的响应数据内容为html格式,因此我们可以用xpath,正则来获取到我们想要的数据
在这里插入图片描述
以下为要爬取的数据及xpath提取的方式

#阅读数
    reade_num = html_data.xpath("//ul[@class='newlist']/li/cite[1]/text()")
    #print(len(reade_num))
    #评论数
    comment_num = html_data.xpath("//ul[@class='newlist']/li/cite[2]/text()")
    #详情url
    base_url = html_data.xpath("//a[@class='note']/@href")
    #print(len(base_url))
    #发布时间
    time_list = html_data.xpath("//li/cite[@class='last']/text()")
    #print(len(time_list))
    #标题
    re_list = re.findall('<a href="(.*?)" title="(.*?)" class="note">',response_data)
    #print(re_list)
    #作者
    re_auto = re.findall('data-poptype="1" target="_blank"><font>(.*?)</font></a>',response_data)
    #print(re_auto)

在我们分析完我们想要爬取的数据之后剩下的好办了

import queue
import random
import re
import threading
import time
import pymysql
import requests
from fake_useragent import FakeUserAgent
from lxml import etree

ua = FakeUserAgent().random
print(ua)
urls = [
    f'http://guba.eastmoney.com/default,99_{i}.html'
    for i in range(1, 10 + 1)
]

headers = {
    'Host': 'guba.eastmoney.com',
    'Cookie': '_adsame_fullscreen_18009=1; st_si=10138147436850; qgqp_b_id=0787d1a8bd2048401b9f128543ecaab9; st_pvi=89781367033016; st_sp=2022-02-22%2013%3A38%3A10; st_inirUrl=http%3A%2F%2Fguba.eastmoney.com%2F; st_sn=7; st_psi=20220222134006993-117001300541-0535043304; st_asi=delete',
    'User-Agent': ua
}


def craw(urls):
    response_data = requests.get(urls, headers=headers).text
    return response_data


def parse(response_data):
    html_data = etree.HTML(response_data)
    # num_list = html_data.xpath("//ul[@class='newlist']/li")
    """
    阅读数://ul[@class='newlist']/li/cite[1]/text()
    评论数://ul[@class='newlist']/li/cite[2]/text()
    标题:<span class="sub">[财富号评论吧] <em class="icon icon_list_himg"></em> <a href="//caifuhao.eastmoney.com/news/20220222074924245918080" title="全球金融巨震!普京承认乌东两地区独立,俄股暴跌17%,欧股受挫" class="note">全球金融巨震!普京承认乌东两地区独立,俄股暴</a></span>
    详情页url://ul[@class='newlist']/li/span/a[2]/@href
    作者://li/cite[@class='aut']/a/text()
    发布时间://li/cite[@class='last']/text()
    """
    #阅读数
    reade_num = html_data.xpath("//ul[@class='newlist']/li/cite[1]/text()")
    #print(len(reade_num))
    #评论数
    comment_num = html_data.xpath("//ul[@class='newlist']/li/cite[2]/text()")
    #详情url
    base_url = html_data.xpath("//a[@class='note']/@href")
    #print(len(base_url))
    #发布时间
    time_list = html_data.xpath("//li/cite[@class='last']/text()")
    #print(len(time_list))
    #标题
    re_list = re.findall('<a href="(.*?)" title="(.*?)" class="note">',response_data)
    #print(re_list)
    #作者
    re_auto = re.findall('data-poptype="1" target="_blank"><font>(.*?)</font></a>',response_data)
    #print(re_auto)
    # return [(reade_num[r].strip(),comment_num[r].strip(),re_list[r][1],re_list[r][0])for r in range(len(reade_num))]
    # for r in range(len(reade_num)):
    #     readenum = reade_num[r].strip()
    #     commentnum = comment_num[r].strip()
    #     title = re_list[r][1]
    #     detil_url = "https://"+base_url[r]
    #     auto = re_auto[r].strip()
    #     fabutime = time_list[r].strip()
    #     print("阅读数:",readenum,"评论数",commentnum,"标题:", title,"详情url:",detil_url,"作者:",auto,"发布时间:",fabutime)
    return [(reade_num[r].strip(), comment_num[r].strip(), re_list[r][1], "https://"+base_url[r],re_auto[r].strip(),time_list[r].strip()) for r in range(len(reade_num))]


def do_craw(url_queue:queue.Queue,html_queue:queue.Queue):
    while True:
        url = url_queue.get()
        html = craw(url)
        html_queue.put(html)
        print(threading.current_thread().name, f"craw{url}", "url_queue.size", url_queue.qsize())

        time.sleep(random.randint(1, 2))


def do_parse(html_queue:queue.Queue,file):
    while True:
        # 获得html_queue这个队列中的内容
        html = html_queue.get()
        # 解析html中的响应内容
        results = parse(html)
        print(results)
        for result in results:
            #print(result)
            file.write(str(result) + '\n')
        print(threading.current_thread().name, "result.size", len(results), "html_queue", html_queue.qsize())
        time.sleep(random.randint(1, 2))


if __name__ == '__main__':
    # 创建一个生产者队列(获取url中的响应数据)
    url_queue = queue.Queue()
    # 创建一个消费者对列(将获取的数据保存)
    html_queue = queue.Queue()
    # 遍历url
    for url in urls:
        # url传入生产者队列中
        url_queue.put(url)

    # 创建相应的生产者线程来进行工作
    for idx in range(4):
        t = threading.Thread(target=do_craw, args=(url_queue, html_queue), name=f"craw{idx}")
        t.start()
    file = open("guba.txt", "w", encoding="utf-8")
    # 创建相应的消费者线程来进行工作
    for index in range(3):
        t = threading.Thread(target=do_parse, args=(html_queue, file), name=f"parse{index}")
        t.start()

**爬取完的效果就是这样咯 **在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于多线程爬取的加强练习 的相关文章

  • 类型错误:object.__new__(int) 不安全,请使用 int.__new__()

    阅读本文时 Python 中的元类是什么 https stackoverflow com questions 100003 what is a metaclass in python 我正在学习使用 new 使用以下代码片段 class a
  • 如何选择单选按钮?

    我在用mechanize我正在尝试从单选按钮列表中选择一个按钮 该列表有 5 项 如何选择第一项 文档没有帮助我 gt gt gt br form
  • pandas 系列值之间的过滤

    If s is a pandas Series http pandas pydata org pandas docs stable dsintro html series 我知道我可以这样做 b s lt 4 or b s gt 0 但我做
  • 如何检查Docker中是否安装了python包?

    我使用Dockerfile成功构建了一个容器 但是 我的代码在容器中不起作用 如果我手动安装所有软件包 它确实有效 我假设我搞砸了一些导致 docker 没有正确安装软件包的事情 所以 我想检查Docker容器中是否安装了python包 最
  • Pandas系列矢量化文本处理

    我想使用矢量化操作改进我的 Pandas 代码 假设我有一个简单的 DataFrame 其中有一个文本列 其中可能包含 url Column1 0 hello http www google com 1 bye www mail com w
  • 如何获取一个类的所有实例

    我是一名初学者 正在学习 Python 我想创建一个课程Person 在构造函数中 我想将我创建的每个实例放入一个名为 实例 的集合中 然后我希望实例 方法返回所有实例 我怎样才能做到这一点 class Person Type annota
  • 如何在 django admin 中使用自定义字段进行搜索

    我有一个模型并已注册到管理员 并且我已使用自定义字段在列表中显示 class ReportsAdmin admin ModelAdmin def investment self inst return models OrderDetail
  • 使用字符串迭代 url - python

    我现在完全被我的代码困住了 首先 我尝试从 volkskrant 的存档页面检索所有网址 这是我被打击的第一步 某一特定日期的 url 如下所示 http www volkskrant nl archief detail 01012016
  • Python 结构的 PHP 替代品

    我很高兴在我的 Python 项目中使用 Fabric 进行部署 现在我正在从事一个更大的 PHP 项目 想知道是否有类似 PHP 的 Fabric 之类的东西 唔 为什么这有关系 Fabric 只是 python 脚本 所以它与项目语言无
  • 如何从张量流数据集迭代器返回同一批次两次?

    我正在转换一些旧代码以使用数据集 API 此代码使用feed dict将一批数据送入列车运行 实际上是三次 然后重新计算损失以供显示使用同一批 所以我需要一个迭代器来返回完全相同的批次两次 或多次 不幸的是 我似乎找不到一种使用张量流数据集
  • python 从字典中获取唯一值

    我想从我的字典中获取唯一的值 Input 320 167 316 0 319 167 401 167 319 168 380 167 265 166 期望的输出 167 0 168 166 我的代码 unique values sorted
  • python 3 configparser.read() 在给定不存在的文件时不会引发异常

    当我尝试使用 configparser read 读取不存在的文件时 我认为它应该引发异常 事实并非如此 它返回一个空列表 显然 我可以测试空列表并引发异常 在我看来 如果 configparser read 引发 FileNotFound
  • Python - 根据条件调用函数

    我想知道是否有一种简洁的方法来根据条件调用函数 我有这个 if list 1 some dataframe df myfunction 我想知道这是否有可能三元运算符 http book pythontips com en latest t
  • 为什么使用 LAMP 托管时避免使用 CGI for Python?

    我已经使用 PHP 多年了 最近我在论坛上看到很多帖子说PHP 已经过时了 现代编程语言更简单 更安全等等 所以 我决定开始学习Python 由于我习惯使用 PHP 因此我刚刚开始通过上传 htaccess 文件来构建页面 addtype
  • 如何使用 NLP 确定句子中的中心词?

    例如 如果我得到一个句子 一名英国士兵在阿富汗战斗中丧生 这句话的中心词是 杀 给定 Python 中的 nltk 包 我怎样才能找到它 我不是在谈论词干 我指的是中心词 您正在寻找中心词句子解析 它可以在 Python 的 nltk 包中
  • 通过 Selenium 和 python 切换到 iframe

    我如何在硒中切换到这个 iframe 只知道 您可以使用 XPath 来定位 iframe driver find element by xpath iframe name Dialogue Window Then switch to th
  • 使用 pandas 中的正则表达式在另一列中查找一列中的值

    我有一个包含两列字符串的 pandas 数据框 我想识别第一列中字符串的所有行 s1 出现在第二列 s2 所以如果我的专栏是 abc abcd ef gh z1y xxyyzz 我想保留第一行 但不想保留第二行 我能想到的唯一方法是 迭代数
  • 忽略稀疏矩阵中的重复条目

    我尝试过初始化csc matrix and csr matrix从列表中 data rows cols 值如文档所示 sparse csc matrix data rows cols shape n n 问题是 我实际上拥有的生成方法dat
  • 在绘图中的线间隙之间添加注释

    I have a graph like this 而不是在上面的日子symbol 我想知道是否有办法可以在行之间添加此注释 从一个点到另一个点 如果以防万一 这可能是重复的 我深表歉意 This is my expected output
  • 检查一个数是否是完全平方数

    如何检查一个数是否是完全平方数 速度并不重要 目前 只是工作 See also Integer square root in python https stackoverflow com questions 15390807 依赖任何浮点计

随机推荐

  • 八大排序算法-快速排序

    快速排序算法的定义是 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此达到整个数据变成有序序列 快速排序算法的基本
  • Unity 性能优化四:UI耗时函数、资源加载、卸载API

    UI耗时函数 1 1 Canvas SendWillRenderCanvases 这个函数是由于自身UI的更新 产生的耗时 1 这里更新的是vertex 属性 比如 color tangent position uv 修改recttrans
  • Python自动抢红包,超详细教程,再也不会错过微信红包了!

    转载自公众号Python多一点 原文链接 Python抢红包 大家好又到了每周六的Python小课堂 今天咱们不说别的 说点有意思的事情 教教大家如何用Python自动抢红包 提到抢红包 就不得不提Xposed框架 它简直是个抢红包的神器
  • c++ 字符串替换指定字符

    这个例子把string字符串中的 替换成 原作者Michael Mrozek 在stackoverflow找到的https stackoverflow com questions 3418231 replace part of a stri
  • 嵌入式开发面试常见问题

    文章目录 0 请问预处理器标识 error的目的是什么 1 嵌入式系统中经常要用到无限循环 如何用C编写死循环 2 程序的局部变量存在于哪里 全局变量存在于哪里 动态申请数据存在于哪里 3 关键字const有什么含义 4 什么是预编译 何时
  • mongdb windows本地进行备份与恢复 也可集成到linux

    1 备份 mongodump h ip 端口 d 备份数据库名称 o 备份路径 示例 mongodump h xxx 27017 u root p test authenticationDatabase admin d test o D t
  • centOS中使用如下命令安装jenkins(详细)

    1 安装jdk wget https download oracle com otn java jdk 8u202 b08 1961070e4c9b4e26a04e7f5a083f551e jdk 8u202 linux x64 tar g
  • VS2017中缺少NuGet 程序包,没有NuGet

    今天装软件的时候 发现我VS2017缺少了NuGet程序包 然后找网上搜索 并没有找到解决步骤 后来去了官网才知道VS2017没有对应网址下载了 已经内嵌在VS2017安装命令台里了 官网在这 https www nuget org dow
  • win10系统开启扫描仪服务器,win10通用扫描仪安装步骤

    win10通用扫描仪安装步骤 为了更加方便地扫描图片文档 很多朋友都会在win10系统电脑中安装扫描仪 不过 最近一些朋友反馈自己在安装之后不知道从哪里打开 让扫描仪开始操作扫描 下面就让小编教我去扫描仪怎么安装吧 扫描仪怎么安装 1 进入
  • ZYNQ之FPGA LED 灯闪烁实验

    一 LED 灯简介 LED灯 又名发光二极管 LED灯工作电流很小 有的仅零点几毫安即可发光 抗冲击和抗震性能好 可靠性高 寿命长 由于这些优点 LED灯被广泛用在仪器仪表中作指示灯 液晶屏背光源等诸多领域 不同材料的发光二极管可以发出红
  • Django 错误之 No module named ‘MySQLdb’

    由于卸载Mysql时将很多相关依赖包都卸载了 重装mysql后启动django出现如下错误 django core exceptions ImproperlyConfigured Error loading MySQLdb module N
  • Linux Shell 之 Shell中的函数调用

    说起函数调用 相信大家也不会陌生 然而对于初学Shell的我来说 Shell中函数调用方式却有点让我不太习惯 自己也走了不少的弯路 因为传递参数时出了一个很 自然 的错误 也让我吃了不少的苦头 所以总结一下Shell中函数的调用方法 一 S
  • linux下设置线程亲和性

    linux下线程亲和性主要就是通过pthread setaffinity np 函数来完成 首先将线程需要绑定的core编号 添加到一个集合中 然后调用此函数就ok 测试代码如下 define GUN SOURCE include
  • 仿真4. 仿真平台架构设计

    背景 1 业务背景 我司对仿真系统的需求日渐增加 比如道路交通的仿真 船舶港口仿真 车联网 ad hoc 仿真 以及运营商承载网的仿真等 2 回顾 什么是仿真时钟 用于描述仿真时间的变化 在连续系统中 仿真时间的变化基于仿真时钟步长的确定
  • 激光三角测距

    激光三角测距原理 1 简介 1 1 Halcon基础 1 2 激光三角法测量系统 2 直射式激光三角测距法 3 斜射式激光三角测距法 3 工作原理 3 1 功能 3 2 普通面阵相机 3 3 线激光的选择 3 4 影响精度的因素 3 5 标
  • Android 禁止输入表情符

    添加过滤器 mEtContent setFilters inputFilters 实现过滤器 private InputFilter inputFilters new InputFilter new InputFilter Pattern
  • MySQL之DQL——查询语言

    前言 今天给大家带来关于数据库查询相关操作 希望各位看官能看个愉快 目录 一 基本概念 1 1 基本概念 1 2 SQL语言的分类 1 3 数据库的存储特点 二 MySQL 2 1 MySQL服务的登录和退出 2 2 MySQL服务的启动和
  • 重磅!Cloud Ace 在班加罗尔和孟买成立新的据点

    Cloud Ace Cooperation 总部位于东京千代田区 Makoto Aoki 总裁 很高兴地宣布 我们已经在班加罗尔建立了新的开发中心 并在孟买建立了新的销售办事处 作为 Cloud Ace 进一步扩大公司在印度业务的努力的一部
  • MySQL之DML

    1 添加数据 语法 insert into 表名 列名1 列名2 列名n values 值1 值2 值n 注意 1 列名和值要一一对应 2 如果表名后 不定义列名 则默认给所有列添加值 insert into 表名 values 值1 值2
  • 关于多线程爬取的加强练习

    多线程能够帮助我们提升爬取爬虫爬取的速度 上一篇文章我们也讲到了如何简单的使用多线程来爬取自己想要要去的东西 今天我们来加强以下 今天我们的目标是多线程爬取股票网站的信息 并保存成文件 本次保存文件的格式为txt 各位想保存别的格式也可以哦