微博scrapy爬虫实战经验分享
这两天想要爬一些微博的数据,在github上找到了开源代码,但是在实际使用过程中遇到了很多困难,在此做一下记录。
安装MongoDB
首先安装MongoDB,Windows系统教程可以参考。
获取微博小号
因为需要爬的数据量较大,笔者采用了senior版本,通过构建微博小号账号池来提高爬虫效率,因此购买了一些微博小号。目前网页版微博已经全部需要验证码登录了,但是有一些小号可以在手机微博极速版APP上免验证登录,从而可以手动获取账号的cookie。这里说一下,购买的小号不一定都可以用,例如笔者买了20个,只有6个可以顺利在极速版APP上免验证登录,其他账号均出现各种问题,包括账号异常无法登录、需要验证码登录或密码不正确等。
具体方法是首先使用微博极速版免验证登录小号,然后在网页版上登录同一账号,此时应需要验证码,选择“使用其他方式登录”→“使用私信接收验证码”,之后就会在手机极速版上接收到一个验证码,使用这个验证码就可以登录小号了,网页版登录成功后就可以手动提取cookie了,谷歌浏览器的方法是右键点击“检查”,在弹出界面上方选择“Network”一栏,然后刷新网页,选择weibo.cn包,找到里面的cookie信息全部复制下来保存就可以了。
将小号的账号、密码、cookie值分别替换WeiboSpider-senior\weibospider\account\db_utils.py文件中insert_cookie函数的相应参数值,然后使用命令行在account目录下运行
python db_utils.py
就可以将该小号的信息保存在MongoDB的weibo数据库里了。但是在这里笔者遇到了第一个bug:
pymongo.errors.ServerSelectionTimeoutError: mongodb:27017: [Errno 11001] getaddrinfo failed, Timeout: 30s, Topology Description: <TopologyDescription id: 600a2ad466cb301ea5d7cc3d, topology_type: Single, servers: [<ServerDescription ('mongodb', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb:27017: [Errno 11001] getaddrinfo failed')>]>
在谷歌上查了很久,终于意识到是我的hostname有问题,解决办法是把db_utils.py文件的“mongo_client”值改为
mongo_client = pymongo.MongoClient(host='mongodb://localhost')
使用上述方法逐个保存所有小号的信息,注意一次只能保存一个小号,不能把insert_cookie的参数改成列表来一次保存多个账号,否则会报错:
pymongo.errors.WriteError: can't use an array for _id, full error: {'index': 0, 'code': 2, 'errmsg': "can't use an array for _id"}
初始化Redis
这里笔者跳过了“添加代理IP”环节,直接初始化Redis。简单解释一下,这一步主要是用来确定你需要爬的信息,按照你的需要将代码
python redis_init.py <arg>
中的“< arg >”替换为相应参数值,可以选择的有user、fan、follow、comment、tweet_by_user_id、tweet_by_keyword。例如你想要依据某个微博用户的id来爬取用户的信息,就先将redis_init.py文件中init_user_spider函数的user_ids参数值替换为你要爬的用户id列表,然后在WeiboSpider-senior\weibospider目录下执行
python redis_init.py user
也可以在“user”后添加其他参数来一次初始化多个参数,如
python redis_init.py user fan follow comment tweet_by_user_id tweet_by_keyword
但如果不指定任何参数就会报错。
这里笔者直接运行了redis_init.py,却出现如下报错:
socket.gaierror: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
redis.exceptions.ConnectionError: Error 11001 connecting to redis:6379. getaddrinfo failed.
再次查了很久,渐渐明白原来Redis也会一种数据库,需要先安装,教程可以参考这里。Redis默认hostname应为“127.0.0.1”,因此还需要将redis_init.py文件中redis_init函数的r值改为
r = redis.Redis(host='127.0.0.1')
之后再运行redis_init.py就可以正常初始化了。
运行爬虫
上述工作全部完成后,就可以运行爬虫了。同理,需要先将WeiboSpider-senior\weibospider\settings.py文件中的“REDIS_HOST”值改为
REDIS_HOST = ‘127.0.0.1’
然后在WeiboSpider-senior\weibospider目录下执行
python run_spider.py <arg>
其中“< arg >”与执行redis_init.py时同理,按需要替换为指定参数。
目前笔者正在进行这一步,但是貌似还是有问题,因为爬不到任何数据,全部是空页,即
[scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
后续如果找到解决办法再来更新吧~
参考文献
[1] https://github.com/nghuyong/WeiboSpider [2] [3] https://stackoverflow.com/questions/46041383/serverselectiontimeouterror-errno-11001-getaddrinfo-failed-python