1. Scrapy框架介绍
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。Scrapy 使用了 Twisted异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
2.Scrapy安装和文档
(1)安装:pip install scrapy
(2)Scrapy官方文档:https://docs.scrapy.org/en/latest/
(3)Scrapy中文文档:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html
注意:Windows系统下还需要安装“win32spi”: pip install pypiwin32
3.Scrapy入门
(1)创建项目
要使用Scrapy框架创建项目,需要通过命令来创建。首先进入到你想要把这个项目存放的目录。然后使用一下命令创建:scrapy startproject [项目名称]。实例代码如下:
d:
cd pycharm
scrapy startproject scrapy_fdemo
(2)创建爬虫
进入到项目所在的文件夹/路径,执行命令,创建爬虫:scrapy genspider [爬虫的名字] ["爬虫的域名"]
d:
cd pycharm
cd scrapy_fdemo
scrapy genspider qsbk "qiushibaike.com"
(3)项目目录结构
- Spiders文件夹:我们可以在Spiders文件夹下编写我们的爬虫文件,里面主要是用于分析response并提取返回的item或者是下一个URL信息,每个Spider负责处理特定的网站或一些网站。__init__.py:项目的初始化文件。
- items.py:通过文件的注释我们了解到这个文件的作用是定义我们所要爬取的信息的相关属性。Item对象是种容器,用来保存获取到的数据。
- middlewares.py : Spider中间件,在这个文件里我们可以定义相关的方法,用以处理蜘蛛的响应输入和请求输出。
- pipelines.py : 在item被Spider收集之后,就会将数据放入到item pipelines中,在这个组件是一个独立的类,他们接收到item并通过它执行一些行为,同时也会决定item是否能留在pipeline,或者被丢弃。
- settings.py : 提供了scrapy组件的方法,通过在此文件中的设置可以控制包括核心、插件、pipeline以及Spider组件。
- scrapy.cfg : 项目的配置文件
- spider包 : 以后所有的爬虫都是存放到这里面
4.Scrapy爬取糗事百科
(1)settings.py 设置
- 将 Obey robots.txt rules 中的ROBOTSTXT_OBEY值设置为 False。如果为True,则必须要有robots.txt才能访问网页。
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
- 在请求头中添加 User-Agent信息:
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
(2)qsbk.py 设置
# -*- coding: utf-8 -*-
import scrapy
class QsbkSpider(scrapy.Spider):
name = 'qsbk'
allowed_domains = ['qiushibaike.com']
start_urls = ['https://www.qiushibaike.com/8hr/page/2/']
def parse(self, response):
divs = response.xpath("//div[@id='content-left']/div")
for div in divs:
author = div.xpath(".//h2/text()").get().strip()
content = div.xpath(".//div[@class='content']//text()").getall()
content = "".join(content).strip()
print "="*50
print content
(3)cmd命令运行爬虫程序
- 进入D:\PyCharm\scrapy_fdemo(爬虫程序所在的文件夹),首先要进入环境中(如果环境不是python.py):
workon crawler-env # crawler-env 是环境名
- 运行爬虫程序代码 , scrapy crawl [name]
scrapy crawl qsbk
(4)在python中运行爬虫程序
新建一个.py文件,写入以下代码,就可以实现第(3)步中的操作:
# -*- coding: utf-8 -*-
from scrapy import cmdline
# 下面两种方式相同
# cmdline.execute("scrapy crawl qsbk".split())
cmdline.execute(["scrapy", 'crawl', 'qsbk'])