# csdn4 **Repository Path**: ou1/csdn4 ## Basic Information - **Project Name**: csdn4 - **Description**: No description available - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2016-07-27 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #csdn4# ---------- **这是一个多进程爬取csdn所有用户的blog文章的程序,爬取后会自动插入到我的另一个项目http://www.ouchaonihao.com/ 中.** ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/140247_a37bfb27_603152.png "在这里输入图片标题") ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/140324_0c39a4f1_603152.png "在这里输入图片标题") ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/140340_e03f2c74_603152.png "在这里输入图片标题") ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/140417_6216b279_603152.png "在这里输入图片标题") ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/140403_94c39903_603152.png "在这里输入图片标题") ## 1. a链接爬取进程: 该程序开启多个进程爬取起始链接‘blog.csdn.net’,使用消息队列的机制不断提取a链接放入到爬取队列,然后分析该地址是否是用户blog地址 如符合规则将该地址放到另一个用户队列,该类进程的处理机制为: 从a链接队列中获一条数据(为url地址)->获取该url地址中的所有a链接->判断该地址是否爬取过->判断是否是环路->插入该队列->分析该条数据是用户blog地址->插入用户blog队列。 ## 2. 用户blog爬取进程: 该类进程将开启多个进程同时读取用户blog队列,该类进程处理机制大概如下: 从用户blog队列获取一条数据(用户的blog url地址)->获取该用户的所有文章列表->获取用户相关信息生成一条json数据,将该数据放到content队列中。 ## 3. conten爬取进程: 该类进程将开启多个进程同时读取content队列,该类进程处理机制大概如下: 从content队列获取一条数据(一个用户相关的所用文章的url地址)->获取文章正文、标题、时间、分类等信息->格式化数据->将数据插入到项目目http://www.ouchaonihao.com/ 中。 content队列数据如下图: ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/141008_9d8c7e68_603152.png "在这里输入图片标题") ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/141031_45a434e1_603152.png "在这里输入图片标题") ## 4. 抓取进程状态自动保存机制 抓取进程每抓取一条数据至队列中,都会自动将该数据保存至mongodb中,每创建一个队列都会自动在mongodb中对应的创建一个集合来存放队列数据,当程序启动时会自动从mongodb中去加载以前的相关数据。 抓取进程每抓取一条url的数据后会自动将该数据进行MD5,并且用该MD5为key建立一个dict,然后将抓取的次数,和url地址存放到该key下,然后保存至一个能被多进程共享的dict中,该dict会将每次增加进来的数据插入到与自己对应的一个mongodb的集合中,当然该dict也可以根据用户删除一个key而相应的去对应的mongodb的集合中删除这一套key的数据。用户每次启动时会加载该队列的mongodb的集合中的数据。因此该程序会识别dict中url爬取次数大于1的选择性的跳过。 html_a_md5: ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/135127_a3630094_603152.png "在这里输入图片标题") htmlblog_a_md5: ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/135419_8154ed65_603152.png "在这里输入图片标题") pageurl_md5: ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/135723_f95ff3d0_603152.png "在这里输入图片标题") content_md5: ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/135839_d5a1345a_603152.png "在这里输入图片标题") ## 5. 关闭与启动: 该程序在关闭时将会把该程序爬取过的所有信息保存为本地信息(将保存在workdir/data中),在下次启动该程序是将会自动加载该类信息到内存,程序将不会爬取以前爬取过的数据。 ## 6. 日志: 所有日志到保存在workdir/log下。 ## 7. 本地数据: 抓取的每个有用户的数据将保存到workdir/users/用户名.json ## 8. mongodb: 该程序包含将数据插入mongodb数据库的功能。默认没有开启. ## 9. 自动使用http代理: 本程序启动时会额外启动两个进程,用户获取代理服务器信息,两个进程功能如下: ### 进程1:自动爬取xicidaili.com的代理服务器信息至数据库的temp表 ### 进程2:程序会自动从数据库的temp表中获取数据,然后测试代理服务器的存活信息,链接速率等等,如果该条代理服务器的信息符合我们设定的条件(测试10次get请求,有8次成功,平均时间小于1s,单次最大时间小于小于2s等等),将会把该条信息插入到proxy表。 ## 10. http proxy的自动使用: 当每个爬虫进程发生了指定次数的get请求是,将会自动更换代理服务器地址。 当每个爬虫进程发生get请求出现超时,或者403,500等错误是也会触发切换代理服务器地址。 ![输入图片说明](http://git.oschina.net/uploads/images/2016/0727/141633_bb21af3b_603152.png "在这里输入图片标题")