爬虫框架Scrapy(二)

2019-07-18 14:59:22 浏览数 (1)

正文共: 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相关知识点回顾

美多商城项目导航帖

项目重要技术点介绍

0 人点赞