记录项目数据采集工作中遇到的问题,改进的过程。
django==1.1.16 python==3.5.3
数据来源有三,所以结构设计大概是下面这种:
django中的app_spider布局将各源的爬取方法单独写成app_spider下的GetData模块,在spider.views中写总的爬取类SpiderMethod,按照数据库设计分别从IP/DOMAIN/HASH进行汇总爬取,期间调用GetData模块的三个py文件中的爬取方法。注意模块的import路径。
写完run,顺序爬取没有问题。
之后加了协程池gevent_pool,效率提高但是出现了常见爬虫限制。
一开始每次数据库写入或读取、更新操作后都会close(),造成下一次使用受限,所以试着run的时候注释掉了。感觉量小。没障碍。
协程池加上,先每轮开了100个协程,mysql默认最大连接数默认100,不改也不关就各种开着连接,理所当然的阻塞了。所以修改mysql的my.init文件, 修改max_connections为1000(最高),重启mysql服务(管理--服务或者mysql command line)。
协程池加上,先每轮开了100个协程,分别出现了api请求频率和次数限制。顺着这些问题去查了爬虫常出现的问题:IP限制、验证码、身份验证,大多有解决或缓解了我的问题。但我现在遇到的一个谷歌人机验证,没找到为何出现验证,也没找到能力之内的解决方法。
下面记录解决常见限制的一些过程。在过程中尝试改用scrapy重写了一下整个爬虫。(scrapy默认多线程的,任务队列中请求失败的会一直一直请求,最后会记录请求次数,成功任务数等等。)所以在scrapy中遇到的这些常见限制也一起说了。
django多协程爬虫/scrapy框架爬虫开ip代理、头部请求构造、UA代理、模拟登陆(cookies)
scrapy开启ip代理需要在中间件增加ProxyMiddleware类,说明代理请求规则,代理可以放在设置文件setting.py中手动更新,也可以建立自己的ip代理池,或者建立自己的ip代理库,每次从库中随机挑选,同时配合ip的有效验证筛选等(还没做)。
UA代理,模拟浏览器也是一样的套路。中间件添加RandomUserAgent类,说明UA获取方法,UA同样可以放在setting.py中手动更新。常见UA网上都有。
头部请求构造放在项目文件py中定义。直接用。
使用cookies模拟登陆用到一些包。同样中间件添加CookiesMiddleware类。然后就是cookies获取的问题了。有手动有自动(selenium)。
网友评论