Anaconda开发环境和Pycharm安装、破解参考以下两篇博客:
一、Scrapy简介
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
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项目
1、新建Python项目,如 “Demo”

2、默认设置
(1)File → Default Settings → Project Interpreter
(2)选择Python安装目录下的系统Interpreter
注意区分Python解析器、PyCharm解析器和项目解析器,都是python.exe只是Package路径不同


3、生成Scrapy框架结构
安装好scrapy类库之后,就可以创建scrapy项目了,pycharm不能直接创建scrapy项目,必须通过命令行创建:
(1)PyCharm → Terminal
(2)输入指令 “scrapy startproject module”,其中module为模块名,如Find
看到如下的信息表示成功创建scrapy项目:

三、遇到的坑:
通过命令行创建scrapy项目时经常会遇到下面的三个坑:
(1)'scrapy' 不是内部或外部命令,也不是可运行的程序或批处理文件。这是因为没有把Anaconda加入到环境变量中。在安装scrapy时,会将scrapy.exe文件安装到Scripts文件夹下面:

如果没有设置环境变量,将无法找到scrapy.exe文件。
(2)ImportError: DLL load failed: 找不到指定的模块。 这个问题是因为lxml类库版本引起的,在window7操作系统会遇到这个问题。我安装的是4.2.5版本,后来改成3.8.0就解决了。将lxml从4.2.5切换成3.8.0的方法如下:

通过上图的安装类库界面,找到lxml,勾选上Specify version选项,然后选择3.8.0,点击“install package”按钮即可。使用anaconda的好处就是,将lxml切换成3.8.0之后,会把相关的openssl和twisted等类库也切换成匹配的类库,因此强烈推荐使用Anaconda安装python。
(3)ImportError: DLL load failed: 操作系统无法运行 %1。 这个是因为c:/windows/system32目录中的ssleay32.dll和libeay32.dll冲突导致的,我的做法是删除掉这个两个文件,创建好scrapy项目后,在恢复回来。因为删除这两个文件会导致某些应用无法运行。在window10操作系统会遇到这个问题。
四、Scrapy项目介绍

scrapy框架结构:
scrapy.cfg: 项目的配置文件。
find/: 该项目的python模块。之后您将在此加入代码。
find/items.py: 项目中的item文件。
find/pipelines.py: 项目中的pipelines文件。
find/settings.py: 项目的设置文件。
find/spiders/: 放置spider代码的目录。
五、创建一个爬虫实例
我们来新建一个 Spider 类,名叫 quotes_spider.py,并将其放置到 find/spiders 目录中
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
可以看到,我们新建的 QuotesSpider 类是继承自 scrapy.Spider 类的;下面看看其属性和方法的意义,
name
是 Spider 的标识符,用于唯一标识该 Spider;它必须在整个项目中是全局唯一的;
start_requests()
必须定义并返回一组可以被 Spider 爬取的 Requests,Request 对象由一个 URL 和一个回调函数构成;
parse()
就是 Request 对象中的回调方法,用来解析每一个 Request 之后的 Response;所以,parse() 方法就是用来解析返回的内容,通过解析得到的 URL 同样可以创建对应的 Requests 进而继续爬取;
再来看看具体的实现,
start_request(self) 方法分别针对 http://quotes.toscrape.com/page/1/ 和 http://quotes.toscrape.com/page/2/ 创建了两个需要被爬取的 Requests 对象;并通过 yield 进行迭代返回;备注,yield 是迭代生成器,是一个 Generator;
parse(self, response) 方法既是对 Request 的反馈的内容 Response 进行解析,这里的解析的逻辑很简单,就是分别创建两个本地文件,然后将 response.body 的内容放入这两个文件当中。
执行的过程需要使用到命令行,注意,这里需要使用到scrapy命令来执行;
$ cd /Users/mac/workspace/scrapy/tutorial
$ python3 -m scrapy crawl quotes
代码执行后在本地生成了两个 html 文件 quotes-1.html 和 quotes-2.html如下

参考链接:
网友评论