了解
6 集成selenium 1 在爬虫中写class ChoutiSpider(scrapy.Spider):
name = \'chouti\'
allowed_domains = [\'www.bilibili.com\']
start_urls = [\'https://www.bilibili.com/v/dance/otaku/#/all/default/0/1/\']
bro=webdriver.Chrome(executable_path=\'./chromedriver\')
bro.implicitly_wait(10)
@staticmethod
def close(spider, reason):
spider.bro.close()
2 在中间件中直接使用
class CnblogsSpiderDownloaderMiddleware:
def process_request(self, request, spider):
spider.bro.get(request.url)
response=HtmlResponse(url=request.url,body=bytes(spider.bro.page_source,encoding=\'utf-8\'))
return response
3 隐藏浏览器?无头浏览器 7 去重规则 1 默认会去重,使用了
from scrapy.dupefilters import RFPDupeFilter
2 在默认的setting中配的
3 本身原理是使用的是集合去重
4 更高级部分
# 是不是同一个地址
127.0.0.1/?name=lqz&age=19
127.0.0.1/?age=19&name=lqz
# 本质原理,把?后的打散了,再排序
fp = self.request_fingerprint(request) # 得到一个指纹,上面那两个地址结果一样
## 自定义去重规则
如果你自己写去重类,如何使用?
写一个类,继承 BaseDupeFilter,重写def request_seen(self, request):
返回true表示爬过了
返回false表示没有爬过
# 你有个更牛逼的去重方案
-集合去重可以,存在问题,如果地址特别多,上亿个地址,集合会特别大,会非常占用内存
-极小内存,完成去重(布隆过滤器)