scrapy

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" 将日志等级设置为warning
    • settings 中设置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 ——》返回有序集合中元素的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值