round 1:
运行:delete FROM test.comment250 where movie_id="美丽人生";
出现报错
0 45 10:47:27 delete FROM test.comment250 where movie_id="美丽人生" Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.000 sec
原因:MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令。
解决:SET SQL_SAFE_UPDATES = 0;
修改下数据库模式
delete FROM test.comment250 where movie_id=“美丽人生”;
最终运行成功。
round 2:
一直在试图寻找豆瓣短评的唯一id来设置主键:
比如在数据库中用data-cid作为唯一id问的内容如下,但是
(短评页面1)(https://movie.douban.com/subject/1292063/comments?start=80&limit=20&status=P&sort=new_score)
(短评页面2)(https://movie.douban.com/subject/1292063/comments?start=100&limit=20&status=P&sort=new_score)
两个页面中出现了相同的短评。怪不得爬取的短评数往往会偏小。
**round3:**最终还是逃不过被豆瓣封ip的下场。然后去阿布云那找测试代理。
刚开始还是403返回,
(1)首先测试代理不好用,不能连接IP,应该不是
(2)后来换了user-agent,发现可以正常爬取。
(2)最后直接上了user-agent池。效果才好一些
纪念一下我的middlewares.py
中的代理中的代码:
""" 阿布云ip代理配置,包括账号密码 """
# 阿布云scrapy 写法
import base64
import logging
proxyServer = "http://http-cla.abuyun.com:9030"
proxyUser = "xxxxxxxxxxxxxxxx" # 购买后点击生成获得
proxyPass = "xxxxxxxxxxxxxxxx" # 购买后点击生成获得
# for Python3
proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")
class AbuyunProxyMiddleware(object):
""" 阿布云ip代理配置 """
def process_request(self, request, spider):
request.meta["proxy"] = proxyServer
request.headers["Proxy-Authorization"] = proxyAuth
logging.debug('Using Proxy:%s' % proxyServer)
在settings.py
文件中:
DOWNLOADER_MIDDLEWARES = {
# 'movie250.middlewares.Movie250DownloaderMiddleware': 543,
'movie250.middlewares.AbuyunProxyMiddleware': 1, # 启用阿布云代理
}
round4:
数据库写入部分总是有些数据莫名其妙写入不了,目前猜测是数据库没有异步存储,跟不上爬虫速度的原因。
如何解决mysql阻塞的问题呢?而如果多次的测试爬虫,就会导致相同的数据不断累积,怎么实现增量爬取?
有人说用下面的方法:
- scrapy-deltafetch
- scrapy-crawl-once(与1不同的是存储的数据库不同)
- scrapy-redis
- scrapy-redis-bloomfilter(3的增强版,存储更多的url,查询更快)
确实听说redis的原子性,还没用过。这次项目还是明天用twisted试试能不能解决。
上价值:
问题总是会有的。从刚开始仅仅只能爬top250的电影信息200来条到现在上w条的数据还是蛮有意思的。