使用多进程
加快爬虫速度的方法有几种,异步,多线程,多进程和分布式,不管是哪种都会用到多实例。这几种方法中,只有多进程适合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平台也会产生僵尸,解决办法参见我的另一篇文章
chromedriver僵尸进程的产生原因以及官方解决办法_robinspada的博客-CSDN博客
下面说是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')
options.add_argument('--no-zygote')
# 替换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文章来源:https://www.toymoban.com/news/detail-459060.html
这个错误的意思可以理解为可用端口耗尽,如果不知道端口,那么webdriver每次就会新返回一个端口,旧的端口没有被复用被抛弃,由于端口是有限的,所以跑了很多网后就会出错。文章来源地址https://www.toymoban.com/news/detail-459060.html
到了这里,关于selenium多实例爬虫的忠告和参数配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!