美食网站建设书,创新作品及其设计方案,wordpress php那个版本,余姚网站建设设计服务一#xff0c;scrapy的概念和流程
1. scrapy的概念
Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。
框架就是把之前简单的操作抽象成一套系统#xff0c;这样我们在使用框架的时候#xff0c;它会自动的帮我们完成很…一scrapy的概念和流程
1. scrapy的概念
Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。
框架就是把之前简单的操作抽象成一套系统这样我们在使用框架的时候它会自动的帮我们完成很多工作我们只需要完成剩余部分 Scrapy 使用了Twisted[twɪstɪd]异步网络框架可以加快我们的下载速度。 Scrapy文档地址http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html 2. scrapy框架的作用 少量的代码就能够快速的抓取 ,框架是代码的半成品提高效率爬虫效率和开发效率 3. scrapy的工作流程
爬虫中起始的url构造成request对象--爬虫中间件--引擎--调度器调度器把request--引擎--下载中间件---下载器下载器发送请求获取response响应----下载中间件----引擎---爬虫中间件---爬虫爬虫提取url地址组装成request对象----爬虫中间件---引擎---调度器重复步骤2爬虫提取数据---引擎---管道处理和保存数据
4.scrapy中每个模块的具体作用 引擎(engine)负责数据和信号在不同模块间的传递
调度器(scheduler)实现一个队列存放引擎发过来的request请求对象
下载器(downloader)发送引擎发过来的request请求获取响应并将响应交给引擎
爬虫(spider)处理引擎发过来的response提取数据提取url并交给引擎
管道(pipeline)处理引擎传递过来的数据比如存储
下载中间件(downloader middleware)可以自定义的下载扩展比如设置代理ip
爬虫中间件(spider middleware)可以自定义request请求和进行response过滤与下载中间件作用重复
注意
爬虫中间件和下载中间件只是运行逻辑的位置不同作用是重复的如替换UA等
二、scrapy的入门使用
1.安装scrapy
1.windonws/Mac安装命令 pip/pip3 install scrapy 换源安装命令pip install scrapy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.comn 2.安装依赖包 pip install pypiwin32 如果不安装以后的项目会报错window系统需要安装LinuxMac不需要
2.scrapy项目开发流程 创建项目: scrapy startproject mySpider生成一个爬虫: scrapy genspider lianjia lianjia.com提取数据: 根据网站结构在spider中实现数据采集相关内容保存数据: 使用pipeline进行数据后续处理和保存
3. 创建项目 通过命令将scrapy项目的的文件生成出来后续步骤都是在项目文件中进行相关操作下面以抓取链家来学习scrapy的入门使用 创建scrapy项目的命令 scrapy startproject 项目名字 示例 scrapy startproject myspider 4. 创建爬虫 通过命令创建出爬虫文件爬虫文件为主要的代码文件通常一个网站的爬取动作都会在爬虫文件中进行编写。 命令 在项目路径下执行: scrapy genspider 爬虫名字 允许爬取的域名 爬虫名字: 作为爬虫运行时的参数允许爬取的域名: 为对于爬虫设置的爬取范围设置之后用于过滤要爬取的url如果爬取的url与允许的域不通则被过滤掉。
示例
cd myspider 这一步是进入当前项目路径
scrapy genspider lianjia lianjia.com 再创建爬虫文件
以上操作完成后再打开pycharm就可以清楚查看到项目层级结构
现对如下几个py文件做说明
1.scrapy.cfg 详细项目配置文件 不需要做改动
2.items.py 定义数据存储模型
# Define here the models for your scraped items# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapy# 实际是一个模板类 主要是用来定义数据存储模型
# 通过这个类实例化 数据实际存到实例对象中
class MyspiderItem(scrapy.Item):# 实际是一个模板类数据建模 事先定义好你要爬取的字段name scrapy.Field() # 租房标题content scrapy.Field() # 详情信息price scrapy.Field() # 价格link scrapy.Field() # 详情链接
3.middlewares.py 用于编写中间件下载中间件爬虫中间件 -- 无特殊需求一般不需要编写
4.lianjia.py 爬虫文件,文件名称自己定义 [后面再来完善该爬虫模块]
import scrapyclass LianjiaSpider(scrapy.Spider):# 爬虫名字name lianjia# 限定爬取的域名范围allowed_domains [cs.lianjia.com]# 起始请求的URLstart_urls [https://cs.lianjia.com/zufang/]# 该方法会接受下载中间件传过来的response并对其进行解析def parse(self, response):pass
5.pipelines.py 管道 -- 主要用于编写数据处理步骤 数据的清洗保存
# Define your item pipelines here# Dont forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass MyspiderPipeline:def process_item(self, itemder):return item
6.settings.py 详细的配置信息设置文件UA 并启动管道
# Scrapy settings for mySpider project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://docs.scrapy.org/en/latest/topics/settings.html
# https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlBOT_NAME mySpiderSPIDER_MODULES [mySpider.spiders]
NEWSPIDER_MODULE mySpider.spiders# Crawl responsibly by identifying yourself (and your website) on the user-agent
# 需要手动修改成自己浏览器的UA
USER_AGENT mySpider (http://www.yourdomain.com)# Obey robots.txt rules
ROBOTSTXT_OBEY False # 需要手动修改为False# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN 16
#CONCURRENT_REQUESTS_PER_IP 16# Disable cookies (enabled by default)
#COOKIES_ENABLED False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED False# Override the default request headers:
# 可以写入一些爬虫所需要的身份信息
#DEFAULT_REQUEST_HEADERS {
# Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,
# Accept-Language: en,
#}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
# SPIDER_MIDDLEWARES {
# mySpider.middlewares.MyspiderSpiderMiddleware: 543,
# }# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES {
# mySpider.middlewares.MyspiderDownloaderMiddleware: 543,
#}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS {
# scrapy.extensions.telnet.TelnetConsole: None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 开启管道类才能写入数据
ITEM_PIPELINES {mySpider.pipelines.MyspiderPipeline: 300,
}# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED True
# The initial download delay
#AUTOTHROTTLE_START_DELAY 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG False# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED True
#HTTPCACHE_EXPIRATION_SECS 0
#HTTPCACHE_DIR httpcache
#HTTPCACHE_IGNORE_HTTP_CODES []
#HTTPCACHE_STORAGE scrapy.extensions.httpcache.FilesystemCacheStorage注意 scrapy.Spider爬虫类中必须有名为parse的解析如果网站结构层次比较复杂也可以自定义其他解析函数在解析函数中提取的url地址如果要发送请求则必须属于allowed_domains范围内但是start_urls中的url地址不受这个限制我们会在后续的课程中学习如何在解析函数中构造发送请求启动爬虫的时候注意启动的位置是在项目路径下启动parse()函数中使用yield返回数据注意解析函数中的yield能够传递的对象只能是BaseItem, Request, dict, None
5.保存数据 利用管道pipeline来处理(保存)数据 5.1 在pipelines.py文件中定义对数据的操作
定义一个管道类重写管道类的process_item方法process_item方法处理完item之后必须返回给引擎
# Define your item pipelines here
#
# Dont forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
import jsonfrom itemadapter import ItemAdapterclass MyspiderPipeline:def __init__(self):self.file open(lianjia.json,w)# 爬虫文件中提取数据的方法每yield一次item就会运行一次# 该方法为固定名称函数def process_item(self, item, spider):# 参数item默认是一个 class mySpider.items.MyspiderItem类信息需要处理成字典dict_data dict(item)print(type(item), type(dict_data))# 将返回的字典数据转为JSON数据json_data json.dumps(dict_data,ensure_asciiFalse),\n# 写入JSON数据self.file.write(json_data)# 参数item:是爬虫文件中yield的返回的数据对象引擎会把这个交给管道中的这个item参数print(建模之后的返回值,item,)# 默认使用完管道之后将数据又返回给引擎return itemdef __del__(self):self.file.close()
5.2 在settings.py配置启用管道
# 设置目录文件 该值的大小决定管道执行的顺序值越小优先级越高该值最好 不要大于1000
ITEM_PIPELINES {mySpider.pipelines.MyspiderPipeline: 300,
}
以上配置项中键为使用的管道类管道类使用.进行分割第一个为项目目录第二个为文件第三个为定义的管道类。 配置项中值为管道的使用顺序设置的数值约小越优先执行该值一般设置为1000以内。
6.运行scrapy
第一种 命令在项目目录下执行scrapy crawl 爬虫名字 示例scrapy crawl 爬虫名字 --nolog 忽略日志信息 第二种
写一个再爬虫项目根目录中创建.py结尾的文件执行以下指令: from scrapy import cmdline cmdline.execute([scrapy,crawl,lianjia]) 7.翻页请求的思路
对于要提取如下图中所有页面上的数据该怎么办 回顾requests模块是如何实现翻页请求的
找到下一页的URL地址调用requests.get(url)
scrapy实现翻页的思路scrapy并无单独的url这个概念scrapy中都是需要将url打包成一个请求对象
找到下一页的url地址把url地址构造成请求对象传递给引擎
8.如何构造Request对象并发送请求
实现方法
确定url地址构造请求scrapy.Request(url,callback) callback指定响应体解析的函数名称表示该请求返回的响应使用哪一个函数进行解析callback不赋值的话默认是给parse方法解析把请求交给引擎yield scrapy.Request(url,callback)
链家爬虫 通过爬取链家页面信息,学习如何实现翻页请求 地址襄阳租房信息_襄阳出租房源|房屋出租价格【襄阳贝壳租房】 思路分析
获取首页的响应数据因为里面有我们想要的翻页链接寻找下一页的地址进行翻页获取数据
三、scrapy总结
scrapy的安装pip install scrapy创建scrapy的项目: scrapy startproject myspider创建scrapy爬虫在项目目录下执行 scrapy genspider lianjia lianjia.com运行scrapy爬虫在项目目录下执行scrapy crawl 爬虫名字 【scrapy crawl 爬虫名字 --nolog 忽略日志信息】解析并获取scrapy爬虫中的数据 response.xpath方法的返回结果是一个类似list的类型其中包含的是selector对象操作和列表一样但是有一些额外的方法extract() 返回一个包含有字符串的列表extract_first() 返回列表中的第一个字符串列表为空没有返回Nonescrapy管道的基本使用: 完善pipelines.py中的process_item方法在settings.py中设置开启pipelineresponse响应对象的常用属性 response.url获取当前响应的url地址response.request.url获取当前响应对应的请求的url地址response.headers获取响应头response.urljoin(url) 用于构造绝对url, 当传入的url参数是一个相对地址时, 根据response.url计算出相应的绝对url.response.body获取响应体也就是html代码byte类型response.text 获取响应体str类型response.status获取响应状态码request请求对象的常用属性 request.url必选请求页面的url地址bytes或str类型。request.callback页面解析函数Callback类型Request请求对象的页面下载完成后由该参数指定的页面解析函数解析页面如果未传递该参数默认调用Spider的parse方法。request.methodHTTP请求的方法默认为‘GET’。request.headersHTTP请求的头部字典dict 类型。request.metaRequest 的元数据字典dict 类型用于给框架中其他组件传递信息比如中间件 Item Pipeline。其他组件可以使用Request 对象的 meta 属性访问该元数据字典 (request.meta), 也用于给响应处理函数传递信息。request.encodingurl 和 body 参数的编码默认为utf-8。如果传入的url或body参数是str 类型就使用该参数进行编码。request.dont_filter默认情况下dont_filterFalse,对同一个url地址多次提交下载请求后面的请求会被去重过滤器过滤避免重复下载。如果将该参数置为True可以使请求避免被过滤强制下载。例如在多次爬取一个内容随时间而变化的页面时每次使用相同的url可以将该参数设置为True。