/weiboSA

微博主题搜索分析,上海租房

Primary LanguagePythonApache License 2.0Apache-2.0

项目具体介绍: 微博话题爬取与存储分析,实战部分

安装部署

将项目git到本地后,请先确保以下环境已经安装:

自己的运行环境是mac10.12,python3.5,应该向下兼容没有测试。windows的童鞋装scrapy比较麻烦,建议安装了anaconda后比较方便。

执行下面命令:

mongod
cd weiboSA scrapy crawl mblogSpider/dbSpider

可选参数:

scrapy crawl mblogSpider -a num= -a new_url=

  • num 代表爬取页面数,默认为100页。
  • new_url 默认为搜索移动端‘上海租房’返回的json文件url,如果要添加其他上海租房信息,比如浦东租房,请自行在Chrome中找到请求的json地址,例如:

http://m.weibo.cn/page/pageJson?
containerid=&containerid=100103type%3D1%26q%3D浦东租房
&type=all
&queryVal=浦东租房
&luicode=10000011
&lfid=100103type%3D%26q%3D上海无中介租房
&title=浦东租房
&v_p=11
&ext=
&fid=100103type%3D1%26q%3D浦东租房
&uicode=10000011
&next_cursor=
&page=
如果要数据库收录‘浦东租房’历史记录信息,请将pipelines.py第87、88行注释掉。一般如果有‘上海租房’了就不要去搜索‘浦东租房’,因为基本上有‘浦东租房’的微博都会有@‘上海租房’,所以下面会出现插入重复记录错误。

➜  weiboZ git:(master) ✗ scrapy crawl mblogSpider -a num=10 -a new_url="http://m.weibo.cn/page/pageJson\?containerid\=\&containerid\=100103type%3D1%26q%3D%E6%B5%A6%E4%B8%9C%E7%A7%9F%E6%88%BF\&type\=all\&queryVal\=%E6%B5%A6%E4%B8%9C%E7%A7%9F%E6%88%BF\&luicode\=10000011\&lfid\=100103type%3D%26q%3D%E4%B8%8A%E6%B5%B7%E6%97%A0%E4%B8%AD%E4%BB%8B%E7%A7%9F%E6%88%BF\&title\=%E6%B5%A6%E4%B8%9C%E7%A7%9F%E6%88%BF\&v_p\=11\&ext\=\&fid\=100103type%3D1%26q%3D%E6%B5%A6%E4%B8%9C%E7%A7%9F%E6%88%BF\&uicode\=10000011\&next_cursor\=\&page\="
2016-10-29 14:41:11 [root] WARNING: 生成MongoPipeline对象
2016-10-29 14:41:11 [root] WARNING: 开始spider
2016-10-29 14:41:11 [root] WARNING: 允许插入数据的时间大于2016-10-29 14:15:05.875000
2016-10-29 14:41:13 [root] WARNING: do page1.
2016-10-29 14:41:13 [root] WARNING: do other pages.
2016-10-29 14:41:13 [root] ERROR: 编号为:E91f233Ds的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:Ef4ri5bC6的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:Ef3UNqMmV的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:Ef3stkA8a的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:Ef3pzmJ6i的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:Ef1OBtvQr的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:Ef03Lj54z的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:EeYLU2GQd的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:EeYlBv7bn的数据插入异常
2016-10-29 14:41:13 [root] ERROR: 编号为:EeXkop2vu的数据插入异常
2016-10-29 14:41:15 [root] WARNING: 结束spider

更改日志显示级别请在setting.py中修改LOG_LEVEL,介意采用项目默认的WARNNING,否则信息会很多。

查询示例

查询当前时区的2016-10-20至今有在9号线附近租房房租不高于2000的信息。

db.house.find(
{
	created_at:{$gt:new Date('2016-10-20T00:00:00')},
	$or:
		[
			{price:{$lte:2000}},
			{price:[]}
		],
	admin:'9号线',
	tag:true
},
{	
	_id:0,
	text:1,
	created_at:1,
	scheme:1
}
).hint('created_at_-1').pretty()

{
	"text" : "房子在大上海国际花园,漕宝路1555弄,距9号线合川路地铁站步行5分钟,距徐家汇站只有4站,现在转租大床,有独立卫生间,公共厨房,房租2400,平摊下来1200,有一女室友,室友宜家上班,限女生,没有物业费,包网络,水电自理@上海租房无中介 @上海租房无中介 @上海租房 @上海租房无中介联盟",
	"scheme" : "http://m.weibo.cn/1641537045/EetVm3WBV?",
	"created_at" : ISODate("2016-10-25T09:18:00Z")
}
{
	"text" : "#上海租房##上海出租#9号线松江泗泾地铁站金地自在城,12层,步行、公交或小区班车直达地铁站。精装,品牌家具家电,主卧1800RMB/月;公寓门禁出入,房东直租,电话:13816835869,或QQ:36804408。@上海租房 @互助租房 @房天下上海租房 @上海租房无中介   @应届毕业生上海租房",
	"scheme" : "http://m.weibo.cn/1641537045/Een8cAoy8?",
	"created_at" : ISODate("2016-10-24T16:00:00Z")
}
{
	"text" : "#上海租房# 个人离开上海:转租地铁9号线朝南主卧带大阳台,离地铁站两分钟!设备齐全,交通方便,随时入住。具体信息看图片~@上海租房 @上海租房无中介联盟 @魔都租房 帮转谢谢!",
	"scheme" : "http://m.weibo.cn/1641537045/EdRpfuKuH?",
	"created_at" : ISODate("2016-10-21T07:14:00Z")
}
{
	"text" : "9号线桂林路 离地铁站8分钟 招女生室友哦 @上海租房 @上海租房无中介联盟 上海·南京西路",
	"scheme" : "http://m.weibo.cn/1641537045/EdJ2U8Kv3?",
	"created_at" : ISODate("2016-10-20T09:57:00Z")
}

更新

  • v1.1
    • 新增豆瓣小组爬取与存储(以标题MD5为主键防止重复)
    • 新增agent随机切换
    • 新增随机静态ip代理(爬了近万个代理ip具有时效性,找几个可行的ip放进setting中)
    • 下载延迟设定为1,延迟越小越容易403错误(被豆瓣识别为爬虫)

QA

  • Q1:怎么单独查找豆瓣的数据。
    A1:豆瓣数据相比微博多了个title字段,只要查找title不为空的即是豆瓣数据。例如:

  • Q2: 想要爬取历史数据,但默认数据库只增加最新数据。
    A2: 数据库有两重机制防止重复,第一个就是根据时间,同一地址的爬虫不会爬取老的数据;第二个是主键约束,比如 豆瓣上相同作者和标题的帖子会被认为重复。要想爬取历史数据需要把pipliens.py中的process_item两行时间约束代码注释。

  • Q3: 代理地址不可用。
    A3: 为防止BAN,提供静态代理地址,但有些地址具有时效性,推荐去找最新的代理地址,或者扩展为动态代理地址。随机代理开启请把下面注释去掉

    # 代理,默认关闭
    #'weiboZ.middlewares.DBDownloaderMiddleware.ProxyMiddleware': 543
  • Q4: 为什么抓了豆瓣的数据数据库中不存储。
    A4: 确认setting设置ITEM_PIPELINESweiboZ.pipelines.dbMongoPipeline,并且数据库中豆瓣数据不是最新的。如果还有问题,日志级别设置为INFO看下爬虫统计结果,如下:

'downloader/request_bytes': 119366, 'downloader/request_count': 100, 'downloader/request_method_count/GET': 100, 'downloader/response_bytes': 481768, 'downloader/response_count': 100, 'downloader/response_status_count/200': 100, 'finish_reason': 'finished', ``` 以上是完全抓取100页豆瓣的统计结果,若response_status_count/403,请设置DOWNLOAD_DELAY 大于1,或者换ip代理。