正文共: 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
的参数:
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相关知识点回顾
美多商城项目导航帖
项目重要技术点介绍