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实现

数据分析:pandas numpy matplotlib hightchart

网页解析库 BeautifulSoup
解析和提取数据
bs=BeautifulSoup(html,“html.parser”) html.parser是 python 自带解析
bs.find(标签,属性) 提取满足要求的首个数据
.find_all(‘div’,class_=’’) 提取满足要求的所有数据

IP代理池原理

常用代理网站:
	站大爷  、github 上开源
	豌豆代理 、阿布云

根据协议区分:
	1.http   代理   爬虫
	2.socks  爬虫

根据匿名程度区分:
	1.高匿代理    不会改变你的数据包   如真实用户
	2.普通匿名代理   会改变数据包  会把IP暴露给服务器
	3.透明代理    提高访问速度,对爬虫无用,不会改变IP
	4.间谍代理   监控作用

代理的选择:
	-推荐使用高匿代理和普通代理
代理的使用
	1.requests中
		-get/post方法中加上proxies参数
			*proxies参数是dict格式,且http/https加上。 'http':"xx.xx.xx.xxx",
	2.scrapy中
		-下载器中替换IP代理
			* scrapy中的每个请求都会经过下载器中间件,可堆积替换ip

IP检测
	剔除无效,过期代理,定期筛选
	ip接口  ip提供接口  方便提取
	参考:https://github.com/jhao104/proxy_pool   依赖安装pip install -r xxx.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值