给大家安利一篇文章:小白进阶之Scrapy第一篇 这篇文章一步步讲如何使用Scrapy框架进行网页爬虫,简直是初学者的福音。
我接下来的内容也是按照他的思路写的,写这篇文章的目的是为了整理一下思路,把一些关键点列出来,大家想详细阅读的直接看上面推荐的文章就行了。如果你看完原文还不太理解,就来看我的总结吧。当然,我在文章的最后也会提供完整的代码,有需要的朋友请自行下载。
使用Scrapy框架之前,先学习下Scrapy是怎么工作的,下面这个图可以很好的说明Scrapy的工作模式:
Scrapy Engine: 引擎;Scheduler:调度器;Downloader:下载器;Item Pipeline:保存数据;Spiders:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
简单来说,就是Spiders把第一个要处理的url的request传给引擎,引擎把url传到调度器中排队,并把处理好的Request传到下载器中,下载器下载后传回引擎,引擎把它送回Spiders(这里的response是默认交给def parse(self, response)函数处理的,所以你的spiders的文件里必须包含有这个函数,具体看代码);Spiders接收到response之后,如果有需要继续跟进的url,即继续向引擎发请求,并将它的responses交给函数 def xxxx(self, responses)处理;如果有Item,即把Item交给Item Pipeline进行数据的保存,然后重复前面的步骤进行循环,直到调度器中不存在任何request后,程序停止。
首先,第一步当然是安装scrapy库了。最简单的就是pip安装了,不过不知道为什么我自己使用这个pip没安装成功,这里给大家提供另一种方法:在pycharm中安装。点击file,选择Default Setting…
选择右上方的“+“:
在搜索框输入你要安装的库,即scrapy,并点击左下方的“Install Package”:
这样便可以安装成功了。那么,怎么开始工程呢?首先,我们得先创建一个工程:ctrl+r,输入cmd并cd到你要保存工程的路径,然后输入:
scrapy startproject XXX ##XXX表示你要保存的工程名
创建完工程后,使用IDE打开工程,可以看到如下目录:
其中mysqlpipelines文件夹,crbook.py, entrypoint.py这三个文件为自己创建的,其他是scrapy自动生成的。
crbook.py: 编写我们的爬虫代码,是我们的工程中最主要的一步;
items.py: 定义一些字段临时保存要存储下来的数据;
pipelines.py: 保存数据到数据库或者本地(本文中使用自己创建的mysqlpipelines文件,包含两个主要文件:sql.py用于写一些基本的数据库操作,比如定义插入数据,去重等函数;pipelines.py用于执行数据存储工作);
setting.py: 做一些基本设置;
middlewares.py:中间件,我们不用管;
scrapy默认是不能在IDE中调试的,因此我们在根目录在添加一个entrypoint.py文件:
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'crbook'])
然后直接run ‘entrypoint.py’ 就行了。PS:前面两项是不变的,而最后一项’crbook’必须与你的爬虫程序crbook.py中的name保持一致,而且这个名字在整个工程中仅能出现这一次,不能重复。
至于整个操作流程,可以这样安排:先在items.py中定义一些字段,然后在spiders文件夹中的crbook.py定义你的爬虫操作,其次是创建一个数据库和建表(对这部分后面会补充说明),接着在mysqlpipelines文件夹中写sql.py和pipelines.py,将爬取到的数据存储到数据库中,当然中间设计到的一些基本设置可以在settings.py中完成。比如,scrapy是默认使用工程自带的pipelines.py存储数据中,但是我们这里使用的是自己创建的mysqlpipelines文件,因此要在settings.py中重新设置:
ITEM_PIPELINES = {
# 'crbook.pipelines.CrbookPipeline': 300,
'crbook.mysqlpipelines.pipelines.CrbookPipeline': 1
}
其中,crbook(项目目录).mysqlpipelines(自己建立的MySQL目录).pipelines(自己建立的pipelines文件).CrbookPipeline(其中定义的类) 后面的 1 是优先级程度(1-1000随意设置,数值越低,组件的优先级越高)
另一方面,原作者在文章中建议我们把以下几行代码的注释去掉:
这几行注释的作用是:scrapy会缓存你有的requests, 当你再次请求时,如果存在缓存文档则直接返回缓存文档,而不是每次都去网站请求,这样即可以加快下载速度,也可以减缓网站压力(原作者的解释)。
在spiders文件夹中的crbook.py这个爬虫程序中,有两点必须要注意的,先贴出部分代码:
import re
import scrapy
from bs4 import BeautifulSoup
from scrapy.http import Request
from crbook.items import CrbookItem
from crbook.items import DcontentItem
class Myspider(scrapy.Spider):
name = 'crbook'
allowed_domains = ['x23us.com'] ##不是必须的。它的作用是只会跟进存在于allowed_domains中的URL。不存在的URL会被忽略。
bash_url = 'https://www.x23us.com/class/'
bashurl = '.html'
def start_requests(self):
for i in range(1,11):
url = self.bash_url + str(i) + '_1' + self.bashurl
yield Request(url, self.parse)
# yield Request('https://www.x23us.com/quanben/1',self.parse)
def parse(self, response):
# print (response.text)
max_num = BeautifulSoup(response.text, 'lxml').find('div', class_ = 'pagelink').find_all('a')[-1].get_text()
bashurl = str(response.url)[:-7]
for num in range(1, int(max_num)+1):
url = bashurl + "_" + str(num) + self.bashurl
# print ('url:', url)
yield Request(url, callback = self.get_name)
首先是代码中的name必须与前面说到的entrypoint.py文件中的第三项保持一致;bash_url是要下载的首地址;其次是allowed_domains的使用,allowed_domains不是必须的。它的作用是只会跟进存在于allowed_domains中的URL。不存在的URL会被忽略。我一开始就是这个地址写错了,导致url都没下载下来。
说完爬虫和存储部分,接下来说说数据库操作的部分吧。在开始这个任务之前,我的电脑是没有mysql数据库的,所以我们得先下载一个,直接到官网下载就行:Download MySQL Community Server
贴个安装教程吧:MySQL数据库的下载及安装教程
注意,mysql有两种安装方式:一种是Installer安装版,另一种为ZIP压缩包的安装方式,zip压缩包要修改配置,相对比较麻烦,因此我使用的是Installer安装版。但mysql新版没有Installer安装版,所以我使用的是以前的版本:5.5.60,不用担心,不影响使用。
安装完mysql后,我们还需要一个可视化工具,如:Navicat_for_MySQL. (下载完打开Navicat_for_MySQL文件夹,双击exe文件就可以直接运行了)。
工具准备好了之后,我们可以开始创建数据库和创建表了。下面提供一些基本操作,都是在终端执行的:
进入数据库:mysql -u root -p
进入后,
创建数据库:create database XXX(数据库名);
查看数据库:show databases;
使用某个数据库:use XXX(数据库名);
之后若想查看该数据库有多少个表:show tables;
创建表:(如下图)
创建表的过程如下图:
要注意的一点是,每个语句的最后必须有分号,不然没法结束输入。
对了,在这个过程中,还必须安装一个python使用mysql的包,由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器(参考自使用MySQL)。安装方式很简单:
easy_install mysql-connector-python
到这里,工具也都准备完成了。文章也差不多结束了。
最后,附上代码:Scrapy爬虫代码