Spider 笔记

scrapy 创建项目
scrapy startproject 项目名
scrapy genspider -t basic 别名 域名
e.g. scrapy genspider -t basic tb taobao.com

url 去重:https://blog.csdn.net/Lijuhao_blog/article/details/89062225
爬虫基础知识:https://www.cnblogs.com/angle6-liu/p/10459132.html
https://www.cnblogs.com/fu-yong/p/9016496.html

l浏览器 json插件:
scrapy+selenium :https://blog.csdn.net/weixin_38601833/article/details/96445651

2019.1.17
xpath==>XML Path Language https://www.jianshu.com/p/59ac8a2a19a6
没有id、name、class等
标签的属性或者文本特征不显著
标签嵌套层次太复杂
contains 函数来增强定位的准确性 属性多值匹配 tr[contains(@class,‘result’)] 得到所有class 包含result的语句
xpath(‘normalize-space(//div)’).extract() 输出结果则是去掉了开头的\r\n\t
四种标签的使用方法

  1. // 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。
  2. / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作
  3. /text() 获取当前路径下的文本内容
  4. /@xxxx 提取当前路径下标签的属性值
  5. | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
  6. . 点 用来选取当前节点
  7. … 双点 选取当前节点的父节点
    8)特殊用法:
    starts-with(@属性名称,属性字符相同部分)
    在这里插入图片描述

string(.) 标签套标签(string里面的点,表示当前节点的意思)
info = data.xpath(‘string(.)’)
当前节点包含的所以文本内容
9)需要取的标签如果没有属性,可以使用text(),posision()来识别标签
10)可使用多重过滤方法寻找标签,例如ul[3][@id=”a”] 这里使用【3】来寻找第三个ul标签 并且它的id属性值为a

12.4 scrapy 基础设置
增量式爬虫,基本步骤同上爬取,只在setting 文件找那个增加以下内容
===参考学习:https://blog.csdn.net/Hepburn_li/article/details/81480616

(减少服务器的压力以及保证数据的准确性。就是每次请求的时候,先判断这个请求是否在已经爬取的队列当中。如果已存在,则舍弃当前请求。)
1. 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
2. 增加了调度的配置, 作用: 把请求对象存储到Redis数据, 从而实现请求的持久化.
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
3. 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True
4. redis_url配置
REDIS_URL = ‘reds://127.0.0.1:6379/2’
5. 如果需要把数据存储到Redis数据库中, 可以配置RedisPipeline
ITEM_PIPELINES = {
# 把爬虫爬取的数据存储到Redis数据库中
‘scrapy_redis.pipelines.RedisPipeline’: 400,
}

==》(scrapy-redis去重机制),Scrapy-Redis将Request的指纹存储到了Redis集合中,每个指纹的长度为40,例如27adcc2e8979cdee0c9cecbbe8bf8ff51edefb61就是一个指纹,它的每一位都是16进制数。

去重效率优化
1)之Bloom Filter的算法
(https://blog.csdn.net/kun1280437633/article/details/80643879)
Bloom Filter,中文名称叫作布隆过滤器,是1970年由Bloom提出的,它可以被用来检测一个元素是否在一个集合中。Bloom Filter的空间利用效率很高,使用它可以大大节省存储空间。Bloom Filter使用位数组表示一个待检测集合,并可以快速地通过概率算法判断一个元素是否存在于这个集合中。

涉及 散列函数 学习参考:https://blog.csdn.net/m0_37925202/article/details/82015731
编写HashMap.py

实现一个基本的散列算法,将一个值经过散列运算后映射到一个m位数组的某一位上
BloomFilter.py
构造 用到k个散列函数,这里要对这几个散列函数指定相同的m值和不同的seed值
2)url经过md5等方法哈希后保存到set,空间节省率能达到84%

爬虫中间件 爬虫防屏蔽中间件,下载器异常状态中间件以及非200状态中间件。

2018.11.21 爬虫框架:
scrapy —
(1)使用Twisted多线程异步网络框架处理并发请求,Twisted的核心逻辑依赖【单线程IO多路复用】,异步存储适用数据量大,防止阻塞。
(2)scrapy框架核心中只有DNS解析的功能适用了(Twisted的reactor提供了)线程池。

   Scrapy 请求发出去的整个流程:
   	a. 首先爬虫将需要发送请求的url(request)经引擎交给Schedule调度器
   	b.调度器排序处理后,经ScrapyEngine、DownloaderMiddlewares(有user_agent、proxy),交给Downloader下载器
   	c.下载器向互联网发送请求、并接受下载响应,将响应经引擎,可选的交给Spider爬虫
   	d.Spider 处理response,提交数据并讲数据经引擎交给ItemPipeline处理保存;提取url 重新经引擎交给Scheduler调度器进行洗衣歌循环,知道队列中无url,请求程序停止结束。

scrapy-redis 分布式爬虫,解决单一主机不能满足的处理速度和网络请求的并发数 的问题

    两种分布式:爬虫分布式以及item处理分布式。分别是由模块scheduler和模块pipelines实现
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读