Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网站数据、提取结构性数据以及各种图片,非常方便。Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。
如何安装?
打开网站:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
在这个python第三方库里下载三个包:分别是lxml,twisted,scrapy。
我下载的是:
lxml-4.3.2-cp37-cp37m-win_amd64.whl
Scrapy-1.6.0-py2.py3-none-any.whl
Twisted-18.9.0-cp37-cp37m-win_amd64.whl
cd 到放这三个包的文件夹下,依次pip3 install 上述三个.whl文件。
例如:
pip3 install lxml-4.3.2-cp37-cp37m-win_amd64.whl
pip3 install Twisted-18.9.0-cp37-cp37m-win_amd64.whl
pip3 install Scrapy-1.6.0-py2.py3-none-any.whl
全部安装完后,直接在命令行输入scrapy,看是否出现以下提示,如果出现则说明安装成功。
Scrapy 1.6.0 - no active project
Usage:
scrapy
[options] [args] Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
[ more ] More commands available when run from project directory
Use "scrapy
-h" to see more info about a command
如果没有成功,在下面网址上下载相应的win插件。
https://sourceforge.net/projects/pywin32/files/pywin32/Build 221/
Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下
Scrapy主要包括了以下组件:
引擎(Scrapy)
用来处理整个系统的数据流, 触发事务(框架核心)
调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduler Middewares)
介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
Scrapy运行流程大概如下:
引擎从调度器中取出一个链接(URL)用于接下来的抓取
引擎把URL封装成一个请求(Request)传给下载器
下载器把资源下载下来,并封装成应答包(Response)
爬虫解析Response
解析出实体(Item),则交给实体管道进行进一步的处理
解析出的是链接(URL),则把URL交给调度器等待抓取
如何开始?
制作 Scrapy 爬虫一共需要四步:
新建项目:新建一个新的爬虫项目
明确目标(编写items.py):明确你想要抓取的目标
制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页
存储内容(pipelines.py):设计管道存储爬取内容
豆瓣读书频道书籍信息爬取
创建工程
scrapy startproject pic
创建爬虫程序
cd pic
scrapy genspider book douban.com
自动创建目录及文件
文件说明:
scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
items.py 设置数据存储模板,用于结构化数据,如:Django的Model
pipelines 数据处理行为,如:一般结构化的数据持久化
settings.py 配置文件,如:递归的层数、并发数,延迟下载等
spiders 爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名
items.py
import scrapy
class PicItem(scrapy.Item):
addr = scrapy.Field()
name = scrapy.Field()
book.py
# -*- coding: utf-8 -*-
import scrapy
import os
# 导入item中结构化数据模板
from pic.items import PicItem
class XhSpider(scrapy.Spider):
# 爬虫名称,唯一
name = "book"
# 允许访问的域
allowed_domains = ["douban.com"]
# 初始URL
start_urls = ['https://book.douban.com/']
def parse(self, response):
# 获取所有图片的a标签
allPics = response.xpath('//div[@class="cover"]/a')
for pic in allPics:
# 分别处理每个图片,取出名称及地址
item = PicItem()
name = pic.xpath('./img/@alt').extract()[0]
addr = pic.xpath('./img/@src').extract()[0]
item['name'] = name
item['addr'] = addr
# 返回爬取到的数据
yield item
settings.py增加如下内容
ITEM_PIPELINES = {'pic.pipelines.PicPipeline':100}
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
pipelines.py
import urllib.request
import os
class PicPipeline(object):
def process_item(self, item, spider):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}
req = urllib.request.Request(url=item['addr'],headers=headers)
res = urllib.request.urlopen(req)
file_name = os.path.join(r'down_pic',item['name']+'.jpg')
with open(file_name,'wb') as fp:
fp.write(res.read())
scrapy crawl book --nolog
(关注公众号 ,回复:0703,可获取源码!)
往期回顾
JupyterLab最全详解,如果你还在使用Notebook,那你就out了!
Pandas教程:初学者入门必备,很全面,很详解!
在windows上安装Pandas的两种简单方法(pip&anaconda)
史上最全的Python基础语法知识清单
Docker新手入门,最全详解看这里!
2020年使用最多的大数据分析工具