1. 如何停止一个爬虫,并且下次启动的时候,从上次停下的地方继续爬取。
# Ctrl + C, 可以停止,下次在运行的时候会继续。
class SplashSpider(scrapy.Spider):
name = 'x'
allowed_domains = ['x.com']
custom_settings = {"JOBDIR": "spider_name_01"} # 添加这这一行。
# 其中 custom_settings, 这里指的是针对当前这个爬虫文件进行特定的设置。
2. meta 的问题
- 借助 meta 传递自己定义的参数 yield Request(a_img_url, meta={'name': item['img_name']})
- 遇到递归解析函数的时候,最后也要带上这同一个 meta.
- meta 最好留给内建的中间件或插件来使用。
3. Request 里面其他有用的参数
- flags (list) – 可以用作监控 logging ,以便记录当前这条 url 已经爬取过了。或是是其他信息。
- cb_kwargs (dict) – 类似 meta,可以取代 meta, 取出来:response.cb_kwargs
- body,带参数的请求,比如请求一个 api 的时候,参数应该放在 body里面, 而不是 meta. meta 有其他的用处。而且body接受的是一个字符串类型的值,因此注意序列化一下。
p = dict()
yield scrapy.Request(base_url, body=json.dumps(p))
4. cookies 传递的问题
cookies 属于个人敏感信息,不要轻易发布出去。
最好是把 cookies 集中保存在别的地方,比如 secret.py, 然后再导入到具体的文件中。
5. selenium 异步请求。
# pip install scrapy-ajax-utils 貌似是国内的某个人写的。
from scrapy_ajax_utils import selenium_support, SeleniumRequest
@selenium_support
class SongSpider(scrapy.Spider):
pass
yield SeleniumRequest(u, callback=self.parse_video)
6. 图片下载失败,错误处理
class WallpaperPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for u in item["pic_urls"]:
yield Request(u)
def file_path(self, request, response=None, info=None, *, item=None):
image_name = request.url.split('?')[0].split("/")[-1] + '.jpg'
return image_name
# 修改默认的错误处理函数,把下载失败的 itme 记录下来。
def item_completed(self, results, item, info):
for ok, x in results:
if not ok:
logger.log(logging.WARNING, x['url'])
return item
网友评论