创建项目
scrapy startproject +项目名称
cd + 项目名称
scrapy genspider +爬虫名+要爬取的域名
创建结果如下:
打开spider文件做详细介绍:
# -*- coding: utf-8 -*-
import scrapy
class HttpbinSpider(scrapy.Spider):
# 爬虫名称
name = 'httpbin'
# 允许爬取的域名
allowed_domains = ['httpbin.org']
# 起始url列表,默认从此列表抓取
start_urls = ['http://httpbin.org/']
def parse(self, response):
pass
下载中间件Downloader Middleware
下载中间件是处于Scrapy的Request和Response之间的处理模块,在整个架构中起作用的位置是两个:
1. 在Scheduler调度处队列的Request发送给Downloder下载之前。
可以在Request执行下载之前对其进行修改。
2.在下载后生成的Response发送给Spider之前。
可以再生成的Response被Spider解析之前对其进行修改。
可以用来修改User-Agent、处理重定向、设置代理、失败重试、设置cookies都需要借助它来实现。
下面介绍一下Downloader Middleware的三个方法:
process_request(self, request, spider):
请求被调度给Downloader之前,此方法就会调用,对Request进行处理。
两个参数分别为,Request对象,对应的Spider。
process_response(self, request, response, spider):
Downloader执行Request下载之后,会得到对应的Response,引擎会将Response发送给Spider进行解析,在发送之前,都可以用此方法对Response进行处理。
参数有三个:
request:Response对应的Request
response:被处理的Response
spider: 对应的Spider
process_exception(self, request, exception, spider):
抛出异常时被调用。
参数有三个:
request:产生异常的Request.
exception:抛出的异常.
spider:产生的异常对应的Spider.
设置User-Agent
1、在setting.py里面加一行定义即可:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
2、设置随机的需要借助Downloader Middleware
class RandomUserAgentMiddleware():
def __init__(self):
self.user_agent = [
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)',
]
def process_request(self,request,spider):
request.headers["User-Agent"] = random.choice(self.user_agent)
要使之生效,需要在settings.py 文件中调用这个Downloader Middleware
DOWNLOADER_MIDDLEWARES = {
'scrapydownloadertest.middlewares.RandomUserAgentMiddleware': 543,
}
重新运行之后可以看到已经改变:
这样,利用process_request()方法成功设置了随机的User-Agent。
process_response()
Downloader Middleware在执行下载之后会得到Response,随后将Response发送给Spider处理。
可以修对Response进行处理。
在RandomUserAgentMiddleware添加如下代码:
class RandomUserAgentMiddleware():
def __init__(self):
self.user_agent = [
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)',
]
def process_request(self,request,spider):
request.headers["User-Agent"] = random.choice(self.user_agent)
def process_response(self,request,response,spider):
#修改状态码
response.status = 201
return response
process_response返回response给spider:
self.logger.debug('Status Code' + str(response.status))
在spider中输出response.status即可看到结果,重新运行之后,观察到的结果如下: