python爬虫scarpy框架详解

1. scrapy图解

流程图

Scrapy中的数据流由执⾏引擎控制,其过程如下:
1、scrapy引擎打开网页,返回requsts请求
2、引擎从Spider中获取到第⼀个要爬取的URL并在调度器(Scheduler)以Request调度。
3、引擎向调度器请求下⼀个要爬取的URL。
4、调度器返回下⼀个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)⽅向:可以对request进行重构)转
发给下载器(Downloader)。
5、⼀旦⻚⾯下载完毕,下载器⽣成⼀个该⻚⾯的Response,并将其通过下载中间件(返回
(response)⽅向)发送给引擎。
6、引擎从下载器中接收到Response并通过Spider中间件(输⼊⽅向)发送给Spider处理。(将响应返回,并用蜘蛛spider解析)
7、Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。(返回解析后的数据给引擎由引擎分发到PIPLINES,同时还可以返回requests对象,可以进行下一步爬取,或者获取url等)
8、引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度
器。(管道PIPLINES多数作用是将数据存放,可以写多个管道,存放在各个数据库中,最后需要在settings文件中配置管道)
9、(从第⼆步)重复直到调度器中没有更多地request,引擎关闭该⽹站。(多用于打开详情页面,并去访问)

2. windows安装scrapy

2.1 windows安装依赖whl文

点击下载whl文件:根据python版本与操作系统位数选择下载:

查看版本和位数

下载

2.2. 处理whl文件

将whl文件放在任意盘,全英文目录.
进入该目录.
pip install Twisted-18.9.0-cp37-cp37m-win_amd64.whl(需要进入虚拟环境再进该目录)
然后.
pip install pypiwin32
最后.
pip install scrapy

注:苹果,linux系统下,直接使用pip install scrapy 下载

3. 创建项目

3.1 进入虚拟环境到任意存放项目的位置

scrapy startproject myscrapy

3.2 进入项目目录中,创建爬虫

scrapy genspider (爬虫名字:football) (域名:如.sports.sina.com.cn)

3.3 项目目录结构为:

层次结构

3.4 项目创建后需要的配置信息

修改该文件settings.py:

  1. 配置不遵循爬虫协议
 ROBOTSTXT_OBEY = False
  1. 配置为中文格式(utf-8)
# 保证获取的数据为中文不乱码
FEED_EXPORT_ENCODING = 'utf-8'
  1. 数据库信息配置(需要的时候才配置)
# mysql setting
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3307
MYSQL_USERNAME = 'root'
MYSQL_PASSWORD = '123456'
MYSQL_DATABASE = 'u17'
# MONGO setting
MONGODB_URI = 'mongodb://127.0.0.1:27017'
MONGODB_DATABASE = 'u17'
  1. 配置管道文件生效(后面的参数代表执行顺序,数值越小,执行越靠前)
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'u17.pipelines.U17MysqlPipeline': 300,
    'u17.pipelines.U17MongoPipeline': 320,
    'u17.pipelines.U17ImagePipeline': 340,

}
  1. 配置图片管道保存图片的位置
IMAGES_STORE = './images'

3.5 项目运行

运行前注意:当前目录是在项目根目录中,输入dir出现cfg的配置文件就代表在根目录.
scrapy crawl football
scrapy crawl football -o result.json(运行并将item中的字段循环写入json文件中)

3.6 项目地址

爬取u17动漫两万多条数据,利用scrapy框架,存取图片,存放json,存mysql,存MongoDB.
github

3.7 小技巧

使用 scrapy shell 网址 进入交互式环境

4. 更换代理

4.1 在中间件中更换代理:middleware(优点:可使用免费代理,缺点:代理利用不充分)

说明:在此处更换代理类似也就是说在request与Downloader之间更换,每次请求页面都会换代理。所以在爬取数据的时候很容易访问失败,所以必须多爬几次,但是多爬几次就会产生重复数据。这时就考虑在数据库中给每条数据的唯一性标志设上唯一性索引。
代码:


4.2 在请求重构处更换代理:spider

代码:

elif isinstance(result_json, dict):
            if result_json.get('code') == 401:

                proxies = proxy_helper.get_proxy()
                url = response.meta.get('url')
                headers = self.get_headers()

                yield Request(url=url, callback=self.parse, headers=headers,
                              meta={'proxy': proxies, 'url': url}, dont_filter=True)

使requests不被过滤

1. 在 allowed_domains 中加入 url 

2. 在 scrapy.Request() 函数中将参数 dont_filter=True 设置为 True

你可能感兴趣的:(python爬虫scarpy框架详解)