加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

scrapy框架基本使用

发布时间:2020-12-20 12:53:42 所属栏目:Python 来源:网络整理
导读:一.框架介绍 1.scrapy框架由五个部分组成: Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等 Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要

一.框架介绍

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读