Scrapy框架学习笔记

一.scrapy

1.创建scrapy项目:

终端输入 scrapy startproject 项目名

2.项目组成:

spiders
__init__.py
自定义的爬虫文件.py ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件
__init__.py
items.py ‐‐‐》定义数据结构的地方,是一个继承自scrapy.Item的类
middlewares.py ‐‐‐》中间件 代理
pipelines.py ‐‐‐》管道文件,里面只有一个类,用于处理下载数据的后续处理
默认是300优先级,值越小优先级越高(11000)
settings.py ‐‐‐》配置文件 比如:是否遵守robots协议,User‐Agent定义等

3.创建爬虫文件

1)跳转到spiders文件夹 cd 目录名字/目录名字/spiders
(2)scrapy genspider 爬虫名字 网页的域名
	爬虫文件的基本组成:
		继承scrapy.Spider类
		name = 'baidu' ‐‐‐》 运行爬虫文件时使用的名字
		allowed_domains ‐‐‐》 爬虫允许的域名,在爬取的时候,如果不是此域名之下的
		url,会被过滤掉
		start_urls ‐‐‐》 声明了爬虫的起始地址,可以写多个url,一般是一个
		parse(self, response) ‐‐‐》解析数据的回调函数
		response.text ‐‐‐》响应的是字符串
		response.body ‐‐‐》响应的是二进制文件
		response.xpath()‐》xpath方法的返回值类型是selector列表
		extract() ‐‐‐》提取的是selector对象的是data
		extract_first() ‐‐‐》提取的是selector列表中的第一个数据

4.运行爬虫文件:

scrapy crawl 爬虫名称
注意:应在spiders文件夹内执行

5.保存为csv文件

scrapy runspider mv.py -o mv.csv

如果出现乱码在setting中添加:

FEED_EXPORT_ENCODING = 'gb18030'

二.scrapy架构组成

1)引擎 ‐‐‐》自动运行,无需关注,会自动组织所有的请求对象,分发给下载器
	(2)下载器 ‐‐‐》从引擎处获取到请求对象后,请求数据
	(3)spiders ‐‐‐》Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例
	如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及
	分析某个网页(或者是有些网页)的地方。
	(4)调度器 ‐‐‐》有自己的调度规则,无需关注
	(5)管道(Item pipeline) ‐‐‐》最终处理数据的管道,会预留接口供我们处理数据
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行
一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
以下是item pipeline的一些典型应用:
	1. 清理HTML数据
	2. 验证爬取的数据(检查item包含某些字段)
	3. 查重(并丢弃)
	4. 将爬取结果保存到数据库中

scrapy shell

1.什么是scrapy shell?

Scrapy终端,是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码。 其本意是用来测试提取
数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码。
该终端是用来测试XPath或CSS表达式,查看他们的工作方式及从爬取的网页中提取的数据。 在编写您的spider时,该
终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。
一旦熟悉了Scrapy终端后,您会发现其在开发和调试spider时发挥的巨大作用。

2.安装ipython

安装:pip install ipython
简介:如果您安装了 IPython ,Scrapy终端将使用 IPython (替代标准Python终端)。 IPython 终端与其他相
比更为强大,提供智能的自动补全,高亮输出,及其他特性。

3.应用:

1)scrapy shell www.baidu.com
(2)scrapy shell http://www.baidu.com
 (3) scrapy shell "http://www.baidu.com"
 (4) scrapy shell "www.baidu.com"
语法:
	(1)response对象:
	response.body
	response.text
	response.url
	response.status
	(2)response的解析:
	response.xpath() (常用)
	使用xpath路径查询特定元素,返回一个selector列表对象
	response.css()
	使用css_selector查询元素,返回一个selector列表对象
	获取内容 :response.css('#su::text').extract_first()
	获取属性 :response.css('#su::attr(“value”)').extract_first()3)selector对象(通过xpath方法调用返回的是seletor列表)
	extract()
	提取selector对象的值
	如果提取不到值 那么会报错
	使用xpath请求到的对象是一个selector对象,需要进一步使用extract()方法拆
	包,转换为unicode字符串
	extract_first()
	提取seletor列表中的第一个值
	如果提取不到值 会返回一个空值
	返回第一个解析到的值,如果列表为空,此种方法也不会报错,会返回一个空值
	xpath()
	css()
	注意:每一个selector对象可以再次的去使用xpath或者css方法

3.yield

  1. 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代
  2. yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代
    时,从上一次迭代遇到的yield后面的代码(下一行)开始执行
  3. 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始

4.scrapy的post请求

1)重写start_requests方法:
	def start_requests(self)
(2) start_requests的返回值:
	scrapy.FormRequest(url=url, headers=headers, callback=self.parse_item, formdata=data)
	url: 要发送的post地址
	headers:可以定制头信息
	callback: 回调函数
	formdata: post所携带的数据,这是一个字典

5.代理

1)到settings.py中,打开一个选项
	DOWNLOADER_MIDDLEWARES = {
	'postproject.middlewares.Proxy': 543,
	}2)到middlewares.py中写代码
	def process_request(self, request, spider):
		request.meta['proxy'] = 'https://113.68.202.10:9999'
		return None

三.连接数据库

在pipelines.py文件:

添加方法:

def open_spider(self,spider):
	self.conn = pymysql.connect(
		host='localhost',
        port=3306,
        user='root',
        password='112233',
        db='movie',
        cursorclass=pymysql.cursors.DictCursor)
    self.cur = self.conn.cursor()
def close_spider(self,spider):
	self.cur.close()
	self.conn.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值