使用baiduspider实现一个异步爬虫

2023-11-17

代码仓库:https://github.com/Kakaluoto/asnyc_spider

爬虫数据收集

1. 各文件说明

  • img:存放爬取的图片
  • async_spider:异步爬虫类
  • data_collector:爬虫执行脚本,从这里启动
  • ip_pool:代理IP池,管理可用的代理IP
  • image_selector:图片筛选器,将爬取的不符合要求的图片删除

2. 涉及到的一些工具和项目

  • 爬虫工具: BaiduSpider: https://github.com/BaiduSpider/BaiduSpider
  • 代理IP池: ProxyPool 代理IP池: https://github.com/jhao104/proxy_pool
  • 随机生成useragent: pip install fake-useragent
  • 异步http请求,异步文件读写: aiohttp, aiofiles, asyncio

3. 相关环境依赖

3.1 安装baiduspider

pip install baiduspider

在路径site-packages/baiduspider下找到_init_.py文件源代码第506行的_

content = self._get_response(url, proxies) # original version

try:
    url = "http://image.baidu.com/search/flip?tn=baiduimage&word=%s&pn=%d" % (
        quote(query),
        (pn - 1) * 20,
    )
    content = self._get_response(url, proxies)  # original version
    result = self.parser.parse_pic(content)
    result = result if result is not None else self.EMPTY

添加输入参数verify: bool = True,修改为content = self._get_response(url, proxies,verify: bool = True)

修改结果如下

try:
    url = "http://image.baidu.com/search/flip?tn=baiduimage&word=%s&pn=%d" % (
        quote(query),
        (pn - 1) * 20,
    )
    content = self._get_response_by_hy(url, proxies,verify=verify)  # original version
    result = self.parser.parse_pic(content)
    result = result if result is not None else self.EMPTY

在路径site-packages/baiduspider下找到_spider.py文代码的第63,77,79行

def _get_response(
    self, url: str, proxies: dict = None, encoding: str = None
) -> str:
    """获取网站响应,并返回源码

        Args:
            url (str): 要获取响应的链接
            proxies (dict): 代理相关设置
            encoding (Union[str, None]): 目标网页编码

        Returns:
            str: 获取到的网站HTML代码
        """
    if proxies is not None:
        response = requests.get(url, headers=self.headers, proxies=proxies)
        else:
            response = requests.get(url, headers=self.headers)

在对应位置添加verify参数,修改为如下结果

def _get_response(
    self, url: str, proxies: dict = None, encoding: str = None, verify=True
) -> str:
    """获取网站响应,并返回源码

        Args:
            url (str): 要获取响应的链接
            proxies (dict): 代理相关设置
            encoding (Union[str, None]): 目标网页编码

        Returns:
            str: 获取到的网站HTML代码
        """
    if proxies is not None:
        response = requests.get(url, headers=self.headers, proxies=proxies, verify=verify)
        else:
            response = requests.get(url, headers=self.headers)

附自定义header:
spider.headers[“Connection”] = “close”
此时可以正常使用search_pic

3.2 windows安装ProxyPool

主要参考python爬虫添加代理ip池ProxyPool (Windows) - 知乎 (zhihu.com)

3.2.1 将代码仓库下载至本地

git clone git@github.com:jhao104/proxy_pool.git

3.2.2 安装代理IP池所需依赖

pip install -r requirements.txt

3.2.3 安装代理ip存储数据库Redis

  • 下载Redis-x64-3.0.504.zipReleases · microsoftarchive/redis (github.com)

  • 启动服务:cmd进入文件位置(文件夹地址栏输入cmd),启动服务

    执行redis-server.exe redis.windows.conf

  • 安装服务:另外打开一个cmd窗口,输入命令安装Redis到windows服务

    redis-server --service-install redis.windows.conf

  • 启动服务:关闭第一个“启动服务”cmd窗口,另开一个cmd窗口,启动服务

    redis-server --service-start (启动之后这个窗口就可以关闭了)

  • 测试是否可以使用:在文件夹下另开一个cmd窗口,输入命令进行测试

    redis-cli.exe -h 127.0.0.1 -p 6379

    输出

    E:\Redis\Redis-x64-3.2.100>redis-cli.exe -h 127.0.0.1 -p 6379
    127.0.0.1:6379> set name 123
    OK
    127.0.0.1:6379>
    

​ 测试成功,Redis安装完成,ProxyPool相关依赖全部完成,接下来修改ProxyPool配置,启动ProxyPool。

3.2.4 修改Proxypool配置文件setting.py:主要需要修改两处

  • DB_CONN:Redis数据库位置,注意ip和端口,127.0.0.1:6379

  • FROXY_FEYCHER:可用的代理ip地址,参考github上实时代理源有效信息

    
    # ############### server config ###############
    HOST = "0.0.0.0"
    
    PORT = 5010
    
    # ############### database config ###################
    # db connection uri
    # example:
    #      Redis: redis://:password@ip:port/db
    #      Ssdb:  ssdb://:password@ip:port
    DB_CONN = 'redis://@127.0.0.1:6379'
    
    # proxy table name
    TABLE_NAME = 'use_proxy'
    
    
    # ###### config the proxy fetch function ######
    PROXY_FETCHER = [
        "freeProxy01",
        "freeProxy02",
        "freeProxy03",
        "freeProxy04",
        "freeProxy05",
        "freeProxy06",
        "freeProxy07",
        "freeProxy08",
        "freeProxy09",
        "freeProxy10"
    ]
    

3.2.4 启动代理池服务:在proxypool文件夹下,分别打开两个cmd窗口运行命令

启动调度程序:python proxyPool.py schedule

启动webApi服务:python proxyPool.py server

4. 可以愉快地开始啦

执行python data_collect.py可以爬取图片

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

使用baiduspider实现一个异步爬虫 的相关文章

随机推荐

  • 网络编程1

    网络编程 网络编程是Java最擅长的方向之一 使用Java进行网络编程时 由虚拟机实现了底层复杂的网络协议 Java程序只需要调用Java标准库提供的接口 就可以简单高效地编写网络程序 1 前置知识点 学习网络编程之前 我们需要先了解什么是
  • HttpRunner 3.x接口自动化: 全面讲解如何落地实战

    今天 我们来一起学习下HttpRunner3 主要讲解如何使用 应用技巧 基本知识点总结和需要注意事项 一篇文章没法面面俱到 如果有重要的地方没写到 可以给我留言 咱们接着补充 整体概览 概述介绍 HttpRunner 是一款面向 HTTP
  • VSCODE远程ssh调试linux+cpolar内网穿透

    VSCODE远程ssh调试linux cpolar内网穿透 一 cpolar配置与使用 1 进入cpolar官网https i cpolar com m 4kqU 2 点击免费使用 进行账号注册 3 linux安装cpolar 国内安装 c
  • js事件循环,根据W3C最新说明

    事件循环 消息循环 首先我们js是一门单线程的语言 这是因为它运行在浏览器的渲染主线程中 而主线程只有一个 那么渲染主线程是如何工作的 渲染主线程是浏览器中最繁忙的线程 需要它处理的任务包括但不限于 解析 HTML 解析 CSS 计算样式
  • QT中日期和时间类

    QT中日期和时间类 QDate QTime QDateTime QDate QDate类可以封装日期信息也可以通过这个类得到日期相关的信息 包括 年 月 日 构造函数 QDate QDate QDate QDate int y int m
  • java多线程和高并发系列二 & 缓存一致性协议MESI

    目录 CPU高速缓存 Cache Memory CPU为何要有高速缓存 带有高速缓存的CPU执行计算的流程 目前流行的多级缓存结构 多核CPU多级缓存一致性协议MESI MESI协议缓存状态 MESI状态转换 多核缓存协同操作 单核读取 双
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis plus 提供了根据id批量更新和修改的方法 这个大家都不陌生 但是当表没有id的时候怎么办 方案一 手写SQL 方案二 手动获取SqlSessionTemplate 就是把mybatis plus 干的事自己干了 方案三
  • Linux_查看CPU信息、机器型号等硬件信息

    查看CPU信息 型号 cat proc cpuinfo grep name cut f2 d uniq c 8 Intel R Xeon R CPU E5410 2 33GHz 看到有8个逻辑CPU 也知道了CPU型号 cat proc c
  • LeetCode刷题之路:14.最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 1 输入 flower flow flight 输出 fl 示例 2 输入 dog racecar car 输出 解释 输入不存在公共前缀 说明 所有输入
  • 前后端正常交互的流程

    普及一下前后端正常交互的流程 1 评审阶段 产品召集前后端进行需求评审 前后端各自捋清楚自己的业务量以及联调之间工作量 从而进行开发时间评估 2 开发准备阶段 前后端一起商量需求中需要联调的部分 进行接口的口头协议交流 3 接口定义阶段 前
  • 几种特征选择方法的比较,孰好孰坏?

    在本文中 重点介绍特征选择方法基于评估机器学习模型的特征重要性在各种不可解释 黑盒 及可解释机器学习方法上的表现 比较了CART Optimal Trees XGBoost和SHAP正确识别相关特征子集的能力 无论使用原生特征重要性方法还是
  • mcem r语言代码_R语言面向对象编程:S3和R6

    R语言面向对象编程 S3和R6 2017 06 10 0 R语言面向对象编程 S3和R6 一 基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数 generic function 的实现方式 1 S3函数的创建 S3对象组成
  • 【IT之路】微信小程序之程序精简

    上一篇我们了解了下微信小程序 这次我们来给新创建出来的小程序瘦身 这里保存了日志模块部分和index页面 一 主体文件精简 app js文件精简 app js App onLaunch 展示本地存储能力 const logs wx getS
  • arduino彩灯计时器电路_Arduino UNO 制作LED节日彩灯

    假日季节来临之际 我觉得利用Arduino和全彩LED灯条制作装饰彩灯将会很有趣 这些LED不仅会亮 而且具有多种不同的颜色 能够为您带来多彩的节日气氛 目录 1 LED灯条简介 2 如何连接LED灯条并接线 3 让我们来点亮LED灯吧 1
  • win10系统:VMware无法在Windows运行 解决方法

    win10系统 VMware无法在Windows运行该怎么办 最近使用win10系统的用户反应系统中出现了无法正常运行VMware的现象 在更新了win10系统之后 首先使用的是VMware14之后发现不兼容Windows10 1903 然
  • JAVA中Bean对象的注解

    java中通常对bean对象的注解 Column 和 Id 都是javax persistence包中的 bean 表明这个属性对应数据库中主键字段 Column 是表明这个属性对应数据库中某个字段
  • 这5种必知的大数据处理框架技术,你的项目到底应该使用其中的哪几种

    大数据是收集 整理 处理大容量数据集 并从中获得见解所需的非传统战略和技术的总称 虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限 但这种计算类型的普遍性 规模 以及价值在最近几年才经历了大规模扩展 本文将介绍大数据系统一个最基
  • Hadoop学习笔记之如何运行一个MapReduce程序

    Hadoop学习笔记之如何运行一个MapReduce程序 MapReduce可以分为两个阶段来处理 一个阶段为map 另一个阶段为reduce 每个阶段都有键值对的输入和输出参数 输入输出键值对的类型由程序决定 程序同样指定了两个函数 ma
  • 笔试面试常见函数编程实现

    目录 strcpy strstr memcpy memove Strcmp atoi 最好不要用其他封装的函数 strcpy C语言标准库函数 原型声明 extern char strcpy char dest const char src
  • 使用baiduspider实现一个异步爬虫

    代码仓库 https github com Kakaluoto asnyc spider 爬虫数据收集 1 各文件说明 img 存放爬取的图片 async spider 异步爬虫类 data collector 爬虫执行脚本 从这里启动 i