前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫框架Scrapy(二)

爬虫框架Scrapy(二)

作者头像
小闫同学啊
发布2019-07-18 14:59:22
7500
发布2019-07-18 14:59:22
举报
文章被收录于专栏:小闫笔记小闫笔记

正文共: 4018 字 5 图 预计阅读时间: 11分钟

每日分享

There are two ways of spreading light: to be the candle or the mirror that reflects it.

传播光的方法有两种:或成为一支蜡烛,或成为一面反射它的镜子。

小闫语录

有位老师,曾送给我们一句话『要让别人因你的存在而感到幸福』,在这里将它送给大家。希望大家要么在创造阳光,要么在传递阳光。

爬虫框架Scrapy(二)

1.请求和响应

1.为什么要三次握手?

答:本质原因是避免服务器空耗资源。举个简单的例子:

简单的回顾一下三次握手,客户端向服务器发起请求;服务器向客户端返回响应,同时也发起请求;客户端返回响应,确认连接。这是完整的三次握手。假设只有两次握手,客户端向服务器发送连接请求,因为网络问题丢包了,根据重传机制客户端再次发送请求,这时没有丢包,然后服务器返回响应,两次握手后建立了连接。客户端和服务器开始传输数据,但是在交流的过程中如果丢的包又回来了,然后服务器开了一个线程进行连接客户端,同时向客户端发起连接请求,但是这个数据包失效了,客户端不会再发消息了,服务器会一直等待,空耗资源,这是一种浪费。

两次握手可以实现通信。而三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源。

2.使用scrapy框架的 FormRequest类发送post请求。

定义start_request函数,手动发送post请求,构造post请求的数据,因为默认是get请求。

3. Request类只提供了get请求。

4. scrapy.Request的参数:

代码语言:javascript
复制
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

中括号里的参数为可选参数

callback:表示当前的url的响应交给哪个函数去处理。

meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等。meta是一个字典。

dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动。

method:指定POST或GET请求。

headers:接收一个字典,其中不包括cookies。

cookies:接收一个字典,专门放置cookies。

body:接收json字符串,为POST的数据,发送payload_post请求时使用。

5.web程序运行的基本流程

a.客户端发送请求。b.服务器返回响应。

6.Flask框架的核心

a.werkzeug:实现了路由、规则、匹配、转换器、安全认证、编码、请求、响应。

b.Jinja2

7.Flask框架的原理

werkzeug.routing中的下列4个类

a.Rule:保存了所有的路由规则,url地址、请求方法,端点(就是 url_map中指向的视图函数名的字符串格式);可以有多个。

b.Map:保存所有的Rule类的实例;只能有一个,列表容器。

c.MapAdapter:在浏览器中通过具体的url,适配具体的视图函数,满足url规则及请求方法,即调用对应的视图函数。

d.Baseconverter:转换器,负责在url地址中匹配参数。

8.Flask中不使用装饰器也可以实现路由映射,使用 add_url_rule这个函数。因为源码中就是使用这个函数来实现的。

9.路由的实现原理:routing.py文件中1013行 add_url_rule(字符串,端点名,视图函数名)。端点默认是和视图函数同名的,因为使用的是装饰器实现的,自己手动实现路由,那么可以自己指定。

10.Flask中URL为什么使用列表?因为使用列表可以添加相同的路径(如果同一个路径有不同的请求方式),如果使用字典的话就key是唯一的。

11.Flask中返回的响应报文是元组。元组的第一个参数是字符串,第二个参数表示状态码,第三个参数是key/value。

12.scrapy中cookie不能够放在headers中,在构造请求的时候专门的cookies参数,能够接受字典形式的cookie。

13.scrapy构造request对象,并发送请求:

代码语言:javascript
复制
yield scrapy.Request(url,callback,meta={})
yield scrapy.FormRequest(url,callback,formdata=表单数据)

2.CrawlSpider

CrawlSpider类定义了一些规则来提供跟进link的方便机制。说白了其实就是自动提取链接并提交请求,一般用来整站爬取。

1.创建一个爬虫继承于CrawlSpider:

代码语言:javascript
复制
scrapy genspider -t crawl ethan ethan.cn

2.一些参数说明:

LinkExtractor:表示链接提取器。

链接提取器的原理就是使用了正则表达式。

rules:表示规则提取器。

follow:表示跟进。

follow指符合rules规则的是否往下继续寻找。

callback:表示回调函数,符合allow规则的url执行回调函数。

总结

1.自动提取链接,并做成请求,发送给引擎。

a.rules变量存放Rule对象的实例。

b.Rule实例是提取链接并对其进行后续处理的规则。

c.链接提取器是必须的,可以单独使用。

d.链接提取器提取的相对url会被不全。

2.不能重写parse方法。

a.使用parsestarturl方法处理起始URL对应的响应。

b.parsestarturl默认返回列表。

3.CrawlSpider爬虫开发步骤:

a.编写rules列表,创建Rule实例。(回调函数使用字符串)

b.编写回调函数。(编写爬取行为或者提取数据)

下载图片可以使用图片管道,crawlspider中有专门处理下载图片的函数。

代码语言:javascript
复制
from scrapy.pipelines.images import ImagesPipeline

2.1案例

需求:东莞阳光网的投诉信息。

crawlspider爬虫的实现步骤

1.修改起始的url,检查运行的域;

2.把该url改成正则表达式,给链接提取器。

3.根据详情页面的数据,提取详情的url规则。

4.根据需要保存数据的不同,建模,选择是否follow跟进链接。

注意:crawlspider爬虫链接提取器的使用,自动跟进符合规则的链接。适合用在一个页面中有所有想要数据,整站爬取,不用考虑翻页、详情页等。不适合用来爬取,不同页面有不同的数据,都要提取的情况。

3.反爬

1.服务器为什么会反爬?

答:爬虫占用服务器资源,影响正常用户。(服务器会有一个并发量的瓶颈,当被爬数据的时候,尤其是分布式爬虫,非常占用资源)为了保持公司的竞争力,保护数据不被爬取。

2.服务器常见的反爬手段(三个方向)

答:判明用户身份(使用User-Agent,cookie)。分析用户行为(通过并发识别爬虫;在线活动时间;页面添加一些正常浏览器浏览访问不到的资源)。动态加载数据(使用ajax或者js加载数据)。

4.反反爬

scrapy常见反反爬措施

1.模拟用户头(设置位置):settings文件、创建请求时、下载器中间件。

2.设置请求延迟:在settings文件中设置DOWNLOAD_DELAY=n;测试目标站点阀值后设置。

3.不带cookies请求数据:settings文件中设置DOOKIES_ENABLED=False。

4.IP代理池。

5.中间件中使用Selenium调用浏览器。

用户代理池的使用

1.先在settings文件中设置 USER_AGENT_LIST添加用户代理池。

2.然后在下载中间件中添加代理。

3.可以使用random.choice从列表中随机选择一个用户代理:

代码语言:javascript
复制
import random
random.choice(list)

付费IP代理的使用:

代码语言:javascript
复制
# 人民币玩家的代码(使用abuyun提供的代理ip)
import base64

# 代理隧道验证信息  这个是在那个网站上申请的
proxyServer = 'http://proxy.abuyun.com:9010' # 收费的代理ip服务器地址,这里是abuyun
proxyUser = 用户名
proxyPass = 密码
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)

class ProxyMiddleware(object):
    def process_request(self, request, spider):
        # 设置代理
        request.meta["proxy"] = proxyServer
        # 设置认证
        request.headers["Proxy-Authorization"] = proxyAuth

5.配置项

LOG_LEVEL 默认为DEBUG,控制日志的等级

代码语言:javascript
复制
LOG_LEVEL = "WARNING"

LOGFILE 设置log日志文件的保存路径,如果设置该参数,日志信息将写入文件,终端将不再显示,且受到LOGLEVEL日志等级的限制

代码语言:javascript
复制
LOG_FILE = "./test.log"

下载延迟:

代码语言:javascript
复制
DOWNLOAD_DELAY = 3

下载并发数:

代码语言:javascript
复制
CONCURRENT_REQUESTS = 32

优质文章推荐:

公众号使用指南

redis操作命令总结

前端中那些让你头疼的英文单词

Flask框架重点知识总结回顾

项目重点知识点详解

难点理解&面试题问答

flask框架中的一些常见问题

团队开发注意事项

浅谈密码加密

Django框架中的英文单词

Django中数据库的相关操作

DRF框架中的英文单词

重点内容回顾-DRF

Django相关知识点回顾

美多商城项目导航帖

项目重要技术点介绍

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈技术精选 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日分享
  • 爬虫框架Scrapy(二)
    • 1.请求和响应
      • 2.CrawlSpider
        • 2.1案例
      • 3.反爬
        • 4.反反爬
          • 5.配置项
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档