一是http代理抓取爬虫
实现的基本思路:
定向捕获网页源代码 利用beautifulsoup 解析网页获取代理ip 获取协议 获取端口 (有时候请求数目过多 会发起50x错误 此时压入解析url的队列等待继续运行即可) 通过python的多线程threading模块进行网络io(毕竟读取时间也是需要时间的) 所以这里多线程跟多线程差距意义应该不是太大 所以选用多线程 多捕获目标站点 拿下的代理地址 压入工作队列等待测试 测试线程运行 (使用requests proxies来测试 但是现在发现测试成功的部分也是会当掉了) 测试成功之后 写入文章 主线程堵塞等待子线程结束 完成退出
二是豆瓣读书爬虫
这个也是定向抓取
单线程:
设置一个分类的列表 列表承载分类 requests.get() tags页面 beautifulsoup解析出内容页面url地址 压入工作队列 解析一个tag之后进行内容页面的解析 写出json数据保存 队列为空结束 然后继续下一个tag 这里注意三点 一个是频率尽量不能设置太快(这个肯定的 考虑考虑别的人感受) 二是要带上Referer(因为测试有一些页面如果没有Referer会导致get的时候产生301还是302(忘了)跳转) 三是需要带上cookies 这样子在网速好的情况下1个分类大概有1000个内容页 大概需要1800s一个tag 试抓取了6万多的图书信息
多线程or多进程:
相差不大 如果需要使用多线程或者多进程获取的话需要带上代理ip 否则的话应该在几秒钟一分钟内就会被ban IP(亲测)
三是某职位招聘网站爬虫
某职位招聘这个爬虫我是测试用的时候用单线程跑 实际抓取用多线程抓取(GIL固然存在可是IO密集型实际上多线程跟多进程差距不是特别大) 而且我也想挂着任务看看讨论什么的。所以都是选择的多线程(多进程我也会做的!!!)
目前网上看到的json有几个接口的
jobs/positionAjax.json?px=new&kd=&pn=1&city= jobs/positionAjax.json?city=&first=true&kd=&pn=1 city默认全国 jobs/positionAjax.json?needAddtionalResult=false post data(first=&pn=&kd=) (这一种更迎合页面实际获取的) get也可以 估计是为了url的优化吧
几个坑:
在进行请求的时候发现了几点:
一个是得到json数据的时候总是得到很大的20几万条(猜测是当前可用的岗位需求)(莫名其妙的总是在第二次请求出现) 二是需要设置请求header 与cookies 三是正常使用一快了就会ban IP
后面是开始编写demo
首先是伪造了头部与得到cookies使用(没有cookies总是20几万的totalcount) 然后程序进入了一个奇怪的地方总是在第二次请求的时候就又会产生20几万的totalcount 第一个第三个都没有问题乃至后面也没问题(后面发现部分还是会有这种问题) 此时百思不得其解 然后选择将产生这种问题的类型写入文件然后等待二次抓取 再者的问题 有一些类型totalcount是比较大的 页数的计算是totalcount/15 页数计算得到的数值也比较大 后来我选择设置一个max_number然后限制url 有一些totalcount比如是20000的那么得到的page_number会达到1000多 但是往往从可能第200页后面的result都是空的 所以还需要一个判断是result为空的时候清空即将要工作的队列 (因为多线程工作一个url队列 然后A线程得到是result是空的话直接清空url队列 然后该类型结束) 然后还需要结合一下http代理 第一个爬虫得到大量的http代理地址(当然很大一部分不可用) 在requests.get拉勾json的时候使用proxies这个参数设置代理(当然要从文件先读过来然后再压入队列供多线程使用) 大概当时是几千个代理http(当不能使用的就再得到下一个使用) 一个晚上抓取了16万左右的职位信息