scrapy框架基本使用

一.框架介绍

1.scrapy框架由五个部分组成:

  • 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,并进行进行后期处理(详细分析、过滤、存储等)的地方.

2.框架示意图

 

二. 框架使用

基本使用流程:

1.创建项目:scrapy startproject 项目名称

2.新建爬虫:scrapy genspider 爬虫文件名 爬虫基础域名

3.编写item

4.spider最后return item

5.在setting中修改pipeline配置

6.在对应pipeline中进行数据持久化操作

 

1.安装

pip install scrapy 
pip install scrapy -i https://pypi.douban.com/simple 使用网络上的资源安装

可能遇到失败:

building 'twisted.test.raiser' extension

error:Microsoft Visual c++ 14.0 is required. Get it with "Microsoft Visual c++ Build tools": ......等字样的错误

此时需先安装文件 Twisted-19.2.0-cp36-cp36m-win_amd64.whl ,需从网络下载到本地, 下载链接: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 在该文件目录下运行命令:

pip install Twisted-19.2.0-cp36-cp36m-win_amd64.whl

再执行 pip install scrapy 进行安装.

2.基本使用

2.1 通过指令创建项目

scrapy startproject reading_network(项目名)

2.2 通过指令创建spider.py文件

命令:

cd reading_network(项目文件)
# 创建基础spider, using template 'basic'
scrapy genspider guoxue "www.dushu.com"   # 生成爬虫文件taobao 后面接所要爬取的域名
# 创建crawlspider, using template 'crawl'   # 设置rule, 可跟踪响应的url
scrapy genspider -t crawl guoxue www.dushu.com   # 后面域名也可不加双引号, 但不能为单引号 ''
class GuoxueSpider(scrapy.Spider):
   name = 'guoxue'
   allowed_domains = ['www.dushu.com']
   start_urls = ['https://www.dushu.com/book/1617.html']

   def parse(self, response):
       print(type(response))
       detail_urls = response.xpath('//div[@class="book-info"]/h3/a/@href').extract()

name: 爬虫名,启动的时候根据爬虫的名字启动项目

allowed_domains:允许的域名,爬取的时候这个请求要不要发送,如果是该允许域名之下的url,就会发送,如果不是,则过滤掉这个请求,这是一个列表,可以写多个允许的域名

start_urls:爬虫起始url,是一个列表,里面可以写多个,一般只写一个

def parse(self, response): 就是以后写代码的地方,parse函数名是固定的,当收到下载数据的时候会自动的调用这个方法, 该方法第二个参数为response,这是一个响应对象,从该对象中获取html字符串,然后解析。

【注】这个parse函数必须返回一个可迭代对象

2.3 定制item.py

定义所需要爬取的字段, 非常简单,复制粘贴

name = scrapy.Field()
img_url = scrapy.Field()
......

2.4 开启爬虫

cmd命令:

scrapy crawl guoxue(爬虫文件名)

可以设置启动文件 start.py:

from scrapy import cmdline
cmdline.execute(['scrapy', 'crawl', 'guoxue'])

若报错:ModuleNotFoundError: No module named 'win32api'

可直接安装: pip install pywin32

或安装对应pywin32版本即可: 下载链接: https://sourceforge.net/projects/pywin32/

根据response 获取网页内容:

response.text    字符串类型
response.body    二进制类型

非常注意: 想要爬取到数据,需在settings文件中修改ROBOTSTXT_OBEY设置:

ROBOTSTXT_OBEY = False  # 表示不遵守robots.txt 通用爬虫的规则

2.5 将爬取数据生成指定格式文件

需在运行命令后接参数:

scrapy crawl guoxue -o data.json  # 编码问题 需在settings中添加 FEED_EXPORT_ENCODING = 'utf-8'
scrapy crawl guoxue -o data.xml
scrapy crawl guoxue -o data.csv

scrapy用-o filename.json 输出时,会默认使用unicode编码,当内容为中文时,输出的json文件不便于查看, 可以在setting.py文件中修改默认的输出编码方式,只需要在setting.py中增加如下语句(默认似乎是没有指定的,所以要增加,如果默认有,就直接修改)

2.6 将爬取数据存入数据库

  • settings.py中配置数据库:

DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = '450502'
DB_DATABASE = 'spider1'
DB_CHARSET = 'utf8'
  • settings.py中配置 ITEM_PIPELINES

    ITEM_PIPELINES = {       # 可以添加多个管道
       # 数字越小优先级越高,越先执行 0-1000
      'reading_network.pipelines.ReadingNetworkMysqlPipeline': 100,  
      'reading_network.pipelines.xxx': 200,
    }
  • 在pipelines.py文件中自定义管道 ReadingNetworkMysqlPipeline

class ReadingNetworkMysqlPipeline(object):  # 需添加到settings管道配置
# 开启爬虫时执行该函数
   def open_spider(self,spider):
       # 创建连接
       settings = get_project_settings()  # 封装好的获取配置文件settings的方法
       host = settings.get('DB_HOST')
       port = settings.get('DB_PORT')
       user = settings.get('DB_USER')
       password = settings.get('DB_PASSWORD')
       database = settings.get('DB_DATABASE')
       charset = settings.get('DB_CHARSET')
       self.conn = pymysql.connect(host=host, port=port, user=user, password=password,
                              database=database, charset=charset)
       self.cursor = self.conn.cursor()


# spider.py下的爬虫需不断返回item对象
   def process_item(self, item, spider):  # 注意位置参数顺序
       data = dict(item)
       keys = ', '.join(data.keys())
       values = ', '.join(['%s'] * len(data))  # '%s, %s, %s'
       sql = f'insert into guoxue({keys}) values({values})'
       print(222)
       try:
           self.cursor.execute(sql, tuple(data.values()))  # 传一个元组 替换 其中%s
           self.conn.commit()
       except Exception as e:
           print(e)
           self.conn.rollback()
       return item


# 关闭爬虫时执行该函数
   def close_spider(self, spider):
       self.cursor.close()
       self.conn.close()

2.7 日志文件配置

# 日志等级 用的是python原生的日志系统
LOG_LEVEL = 'ERROR' # 可以解决终端打印太多日志消息的问题, 只打印错误信息
LOG_FILE = './log.txt' # 指定路径

需要自己写日志输出方法

2.8 修改输出文件默认编码格式

settings.py添加 :

FEED_EXPORT_ENCODING = 'utf-8'  # 默认utf-8

参考官方文档: 链接: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

posted @ 2019-07-29 21:56  Deaseyy  阅读(265)  评论(0编辑  收藏  举报