scrapy
scrapy的数据流程
- 调取器——》request对象——》引擎——》下载中间件——》下载器
- 下载器发送请求,获取响应——》response——》下载中间件——》引擎——》爬虫中间件——spider
- spider提取数据——》引擎——》pipeline
- spider提取的url地址——》构造request对象——》爬虫中间件——》引擎——》调度器
scrapy的使用流程
-
创建项目
scrapy startproject 项目名
-
创建爬虫:
cd <project>
scrapy genspider 爬虫名 爬取范围
- 完善爬虫:
start_url, response——>parse
- 使用yield将数据传递给管道
- 能够使用yield的数据:
dict, request, item, None
- 开启管道:键:位置,值:值越小,距离引擎越近,优先级越高
-
运行爬虫:
scrapy crawl 爬虫名
logging 模块的使用
-
scrapy中的使用
settings
中设置LOG_LEVEL="WARNING"
将日志等级设置为warningsettings
中设置LOG_FILE="./a.log"
,设置日志的保存位置import logging
实例化logger的方式,显示当前的日志位置
-
普通项目中
import logging
-
logging.basicConfig(...)
,设置日志输出的样式和格式- 实例化一个
logger = logging.getLogger(__name__)
- 实例化一个
scrapy.Request中的参数
scrapy.Request(url, callback, meta, dont_filter)
- url:将要处理的数据所在的url
- callback:回调函数,指明数据交给谁来处理
- meta:字典类型,将上一个函数处理的数据传递给下一个函数
meta={'item':item}
,response.meta['item']
- dont_filter=True:表示请求过的URL地址还会再次被请求
scrapy中的Items
- Item类,继承自scrapy.Item,name=scrapy.Field()
- Item 定义哪些字段需要抓取,没有定义的字段抓取会报错
- 在mongodb中插入数据的时候需要先转换成字典:dict(item)
pipeline中open_spider和close_spider是什么
- open_spider:爬虫开启执行一次,只有一次
- close_spider:爬虫关闭的时候执行一次,只有一次
crawlspider
-
创建crawlspider:
scrapy genspider -t crawl 爬虫名 域名
-
# LinkExtractor 链接提取器,提取url地址 # callback 提取url地址的response会交给callback处理 # follow 当前url地址的response是否重现经过Rule来提取url地址
-
CrawlSpider中不能再有以parse为名字的数据提取函数,这个方法被CrawlSpider用来实现基础url提取等功能
-
如果多个Rule都满足某一个url,会从rules中选择第一个满足的进行操作
-
LinkExtractor常见参数:
- allow:提取满足正则的url
- deny:不提取满足正则的url
- restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接
scrapy模拟登陆
直接携带cookies登陆
-
def start_requests(self): # 覆盖父类的方法 cookies = # 浏览器中的cookies cookies = {i.split('=')[0]:i.split('=')[1] for i in cookies.split('; ')} # 将cookies转换为dict yield scrapy.Request( self.start_urls[0], callback=self.parse, cookies=cookies )
发送post请求
-
yield scrapy.FormRequest(url, form_data, callback)
-
将浏览器中的form-data中的参数放入form_data中
def parse(self, response): commit = response.xpath('//div[@class="auth-form-body mt-3"]/input[last()]/@value').extract_first() authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract_first() timestamp = response.xpath('//input[@name="timestamp"]/@value').extract_first() timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').extract_first() post_data = { "login":"用户名", "password":"密码", "ga_id":"", "webauthn-support":"supported", "webauthn-iuvpaa-support":"supported", "return_to":"", "allow_signup":"", "client_id":"", "integration":"", "required_field_1a16":"", "commit":commit, "authenticity_token":authenticity_token, "timestamp":timestamp, "timestamp_secret":timestamp_secret } yield scrapy.FormRequest( url='https://github.com/session', formdata=post_data, callback=self.after_login )
模拟自动登陆
-
当请求网页的form-data表单中有action时,scrapy可以实现自动登陆
def parse(self, response): yield scrapy.FormRequest.from_response( response, # 自动寻找response中的form表单 formdata={"login":"登录名","password":"密码",}, callback=self.after_login )
scrapy_redis
作用:request去重,爬虫持久化,轻松实现分布式
1、clone github scrapy-redis : 源码文件
git clone https://github.com/rolando/scrapy-redis.git
2、研究项目自带的三个demo
mv scrapy-redis/example-project ~/scrapyredis-project
Redis概念
中文文档:http://www.redis.cn/commands.html
Redis是一个开源的,内存数据库,可以用作数据库、缓存和消息中间件,支持多种数据结构。默认情况下有16个数据库。
常用命令
-
redis-server stop :停止
-
redis-server start :启动
-
redis-sever restart :重启
-
redis-cli -h -p : 远程连接redis数据库
-
select 1——》切换到db1,默认在db0
-
keys * ——》查看所有的redis键
-
type “键”——》查看键的数据类型
-
flushdb ——》清空当前db
-
flushall ——》清空所有db
列表
- lpush mylist “word” ——》向mylist从左边添加一个值
- lrange mylist 0 -1 ——》返回mylist中的所有值
- llen mylist ——》返回mylist的长度
集合
- sadd myset “hello” ——》往set中添加数据
- smembers myset ——》获取myset中所有的元素
- scard myset ——》获取myset中元素的数量
有序集合
-
zadd myzset 1 “one” ——》在分数1的位置插入元素one
-
zrange myzset 0 -1 withscores ——》返回zset中的所有分数和对应的值
-
zcard myzset ——》返回有序集合中元素的个数
中所有的元素
- scard myset ——》获取myset中元素的数量
有序集合
-
zadd myzset 1 “one” ——》在分数1的位置插入元素one
-
zrange myzset 0 -1 withscores ——》返回zset中的所有分数和对应的值
-
zcard myzset ——》返回有序集合中元素的个数