详细代码请看qiming(scrapy)
scrapy 数据流
1、初始的时候,我们需要添加start_urls或是实现start_requests函数,就会生成初始的Request,初始Requests会被发送到Engine中,不会经过Spider中间件
2、Engine 会将Requests放置到Scheduler中存储,等待Engine获取并下载内容
3、Engine会根据当前的并发数量选择获取Scheduler中Request下载,并发数量在setting里的CONCURRENT_REQUESTS
4、Engine获取了Request之后,会调用Downloader下载他,在这个过程中,会经过Downloader中间件(process_request()函数)
5、Downloader下载Request对应的内容Response,之后返回给Engine,会经过Downloader中间件,process_response
6、将Response返回Spiders,之后会经过Spider中间件(process_spider_input函数,接收的是Response)
7、Spider处理Response获取Items或者新的Request,返回给Engine,这之后经过Spider中间件(process_spider_output函数),
8、Engine会区分获取到的是Items还是Requests,如果是Items,发送Item pipeline,如果是Request,发送给Scheduler
9、循环第三步
使用内置的图片的下载器的方法
一、直接下载到download文件夹中,随便存放
1、添加Image pipeline(在SETTING的Item_PIPELINES写入下命令)
‘scrapy.pipelines.images.Imagespipeline’ : 1
2、添加图片下载地址(SETTING里的 IMAGES_STORE)
IMAGES_STORE = ‘download’ 放在setting的最后就行
3、将图片的URL放到列表中(url_list),再将(url_list)放到item[‘image_urls’]
二、每个图片按影片名字存放
1.去pipelines输入
from scrapy.pipelines.images imprt Imagespipeline
class DoubanImagespipeline(Imagespipeline)
重写此类 去images.py找源码
前提:
1.在scrapy中,每一个URL都对应着一个函数,把他叫做Request(对应关系)
元件:
Scheduler :调度器:主要的功能是将Request(URL —函数)存储在这之中,如果理解中纪委的代码,与Queue的功能类似
Downloader:下载器:主要的功能是将Request 调用下载函数获取Response的信息 就是爬虫的第三步,相当于downloae_page
Spiders:爬虫程序,即爬虫的第四步,通过获取的返回信息得到具体的内容
Item Pinpline:内容管道,爬虫的第五步,存储的作用
Scrapy Engine:支持多线程
DOWNLOADER MIDDLEWARE(下载器中间件):
MIDDLEWARE(中间件):将后面的内容进行隔离,统一的进行一些处理
SPIDERMIDDLEWARE
1|‘scrapy.spidermiddlewares.httperror.HttpErrorMiddleware’: 50,是处理Response错误的中间件(status_code判断是否在正常范围)
2、‘scrapy.spidermiddlewares.offsite.OffsiteMiddleware’: 500, 这个是处理allowed_domin的,跟Request/Item有关(域名)
3、 ‘scrapy.spidermiddlewares.referer.RefererMiddleware’: 700,自动添加referer,跟Request/Item有关
4、‘scrapy.spidermiddlewares.urllength.UrlLengthMiddleware’: 800,去除过长的URL,跟Request/Item有关
5、 ‘scrapy.spidermiddlewares.depth.DepthMiddleware’: 900,爬取内容的深度,跟Request/Item有关
数字越小,越靠近Engine,数字越大,越靠近Downloader
DOWNLOADERMIDDLEWARE
1、 ‘scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware’: 100,
Robot协议,跟Request有关
2、 ‘scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware’: 300,如果需要auth,去headers添加,跟Request有关
3、‘scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware’: 350, timeout值 ,跟Request有关
4’scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware’: 400, 默认headers,跟Request有关
5、‘scrapy.downloadermiddlewares.useragent.UserAgentMiddleware’: 500, useragent,跟Request有关
6、‘scrapy.downloadermiddlewares.retry.RetryMiddleware’: 550,报错后重试,跟Response有关
7、‘scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware’: 560,用了google的某种标准做的ajax网站可以用这个爬,跟Response有关
8、‘scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware’: 580,处理HTML的标签,跟Response有关 9、‘scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware’: 590, 解开压缩的网页
10、‘scrapy.downloadermiddlewares.redirect.RedirectMiddleware’: 600,是否允许做重定向,即有时候访问网站,先返回一个301或者303,再跳到相应页面,跟Response有关
11、‘scrapy.downloadermiddlewares.cookies.CookiesMiddleware’: 700, 下次访问自动带上cookie,跟Response有关
12、‘scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware’: 750,什么时候跟新代理是关键,所有与跟Response关系更大
13、 ‘scrapy.downloadermiddlewares.stats.DownloaderStats’: 850, 获取下载器的状态信息(如哪些页面获取失败了),跟Response有关
14、‘scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware’: 900, 缓存的机质,跟Response有关
数字越小,越靠近Engine,数字越大,越靠近Spider
步骤
一、创建Scrapy项目:
Scrapy startproject 项目名
二、创建爬虫:
cd 文件夹
scrapy genspider 爬虫名字 +爬取网站的域名(不要http和www)
三、执行爬虫
scrapy crawl 爬虫名
或者建py文件
from scrapy.cmdline import execute
# 这样也能执行爬虫
execute(['sxrapy', 'crawl', 'lianjia'])
# 最常用
execute('scrapy crawl lianjia'.strip())
把setting里的pipeline取消注释
1.requests, get post
如何在scrapy中调用post的方法
# GET方法:scrapy.Request
# POST的内容 crapy.FormRequest
2.Scrapy 中如何添加headers:1.User-Agent、2、Referer 3、Cookie
3、如果爬虫的过程中遇到了需要添加代理的情况,我们就添加代理
添加代理去middleware里去添加,这样每个spider都可以使用
4、多线程必须加锁子
from twisted.internet.defer import DeferredLock
self.lock.require()
***
self.lock.release()
小技巧
1、对于写的xpath想验证一下对不对,去命令行
scrapy shell + 网地址
再response.xpath(’***’)即可验证
2、按住ALT键,双击多个元素,同时复制,或者选好多行一起操作(pycharm里)
项目结构
item.py:用来存放爬虫爬取下来数据的模型
middlewares.py:用来存放各种中间件的文件
pipelines.py:用来将items的模型存储到本地磁盘中
settings.py:本爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池等)
scrapy.cfg:项目的配置文件
spiders包:以后所有的爬虫,都是存放到这个里面
步骤
1.pip install scrapy、pip install pypiwin32
2.cmd里scrapy startproject +文件名—>cd + 文件名—>scrapy genspider + spider名 + “域名”
3.settings.py里设置ROBOTSTXT_OBEY = False
4.把settings.py里的requests header 取消注释,并在末尾加上 【‘User-Agent’:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36’】这是本机的
分布式 Scrapy redis
对于多台机器同时爬取,实现任务式,即这一条爬取了就从redis把他消除,其他机器就不会爬取此内容