0


selenium多实例爬虫的忠告和参数配置

使用多进程

加快爬虫速度的方法有几种,异步,多线程,多进程和分布式,不管是哪种都会用到多实例。这几种方法中,只有多进程适合selenium,selenium本身不支持异步,多线程曾经尝试过似乎有问题。

采用哪种框架

单线程爬虫本身很简单,而大规模的分布式多进程爬虫就比较复杂,Scrapy这种简单的框架拿来学习用或者做简单事情够用了,真实的需求往往比较复杂,需要大量定制,需要对Scrapy非常了解,与其被Scrapy这个框框限制住,不如自己写。没有完全通用的框架,爬虫共通的部分只有URL去重,除非有非常适合需求的框架,否则不如自己写。如果是大规模分布式多进程爬虫,可以采用celery来做分布式框架,爬虫自己写。

自己写爬虫需要注意什么

爬虫归结起来有几个部分:

0.从任务队列中获取URL

单线程爬虫可以直接采用list数据类型,多进程的一般使用数据库比如redis,对任务调度有很复杂的要求的话,可以使用mysql

1.下载网页(借助selenium,requests)

2.分析网页数据和下层链接,按需要保存(使用xpath等等)

3.下层链接按照需要进行筛选,去掉重复URL后,加入任务队列

如果是单线程爬虫,去重可以直接用python的set数据类型,如果是多进程爬虫,通常使用redis的set数据类型。

4.循环直到任务队列为空

采用哪个平台

windows和linux都使用过,个人建议使用linux,windows上感觉有内存泄漏,爬虫跑多了会内存不足,还有一个重要原因是linux可以使用docker,docker绝对是安装开发部署的利器,测试环境更是必备。

采用哪个语言

其实哪个语言都可以开发爬虫,要省事建议采用主流语言python,开发随大流非常重要,如果你选择冷僻的语言就意味着你一个独自前行,选择主流语言就意味着有很多人与你同行,给你帮助。当然C#,java也算是主流,其他的不建议选择。

要注意内存泄漏

大规模爬虫要爬成千上万的网页,稳定性和坚固性非常重要。chromedriver和chrome都是爬虫的子进程,用windows平台的时候常常出现爬虫终了了,但是chromedriver,chrome进程残留的情况。linux似乎没有出现,为了预防万一,爬虫退出前杀死一下自己的子进程更安全。

比如说退出时采用这种代码,确保没有内存泄漏。

        if driver is not None:
            try:
                driver.quit()
            except:
                pass
            # 杀死所有子进程(如果chrome还有残留)
            os.system('pkill -P%s -9'%(os.getpid(),))

下面说是selenium多实例爬虫的参数配置

    options = webdriver.ChromeOptions()
    # 必须是headless=new,否则download.default_directory不起作用
    options.add_argument('--headless=new')
    # 下面这些参数是必须的,否则可能出错
    options.add_argument('--disable-gpu')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    # 替换User-Agent
    options.add_argument(f'user-agent={user_agent}')
    options.add_argument('--proxy-server=192.168.100.xx:24000')
    # 最坑的设置,对于并行爬虫是必须的
    options.add_argument(f'--user-data-dir={userdir}')
    options.add_argument(f"--remote-debugging-port={port}")
    # 使用大容量缓存,减少流量
    options.add_argument('--disk-cache-size=2000000000')
    # 下面这些参数估计没有啥作用,暂时保留
    options.add_argument('--disable-setuid-sandbox')
    options.add_argument("--start-maximized")
    options.add_argument("--disable-infobars")
    options.add_argument("--disable-extensions")
    # 设置下载文件目录为不存在的目录,使其无法下载,估计设置
    prefs = {'download.default_directory': '/tmp/download'}
    options.add_experimental_option('prefs', prefs)

这个设置是踩过无数坑的血泪经验,代码有注解,只对其中最坑的配置说明一下

options.add_argument(f'--**user-data-dir**={userdir}')
 options.add_argument(f"--**remote-debugging-port**={port}")

这2参数个必须设置成每个进程不一样,使各个进程之间完全隔离,很多单线程爬虫没有提到这2个参数,如果不设置就会有各种稀奇古怪的错误和无尽的烦恼。关键是这些错误都不容易再现,往往爬了很多网后才出现,而错误信息往往把你带偏,不知道真实的原因所在。

比如说

org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn’t exist

这个错误的意思可以理解为可用端口耗尽,如果不知道端口,那么webdriver每次就会新返回一个端口,旧的端口没有被复用被抛弃,由于端口是有限的,所以跑了很多网后就会出错。

标签: 爬虫 selenium python

本文转载自: https://blog.csdn.net/robinspada/article/details/130481622
版权归原作者 robinspada 所有, 如有侵权,请联系我们删除。

“selenium多实例爬虫的忠告和参数配置”的评论:

还没有评论