精华内容
下载资源
问答
  • scrapy框架
    万次阅读 多人点赞
    2021-07-05 12:11:53

    (1)Scrapy模块安装

    scrapy支持Python2.7和python3.4以上版本。

    python包可以用全局安装(也称为系统范围),也可以安装在用户空间中。

    Windows
    一.直接安装
    1.在https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应的Twisted的版本文件
    2. 在命令行进入到Twisted的目录 执行pip install 加Twisted文件名

    3.执行pip install scrapy
    二.annaconda 下安装 (官方推荐)
    1.安装conda
    conda旧版本 https://docs.anaconda.com/anaconda/packages/oldpkglists/
    安装方法 https://blog.csdn.net/ychgyyn/article/details/82119201
    2. 安装scrapy conda install scrapy

    (2)Scrapy框架简介

    Scrapy是纯Python开发的一个高效,结构化的网页抓取框架。

    Scrapy是个啥?

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。 Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试 Scrapy使用了Twisted 异步网络库来处理网络通讯。

    我们为啥要用这玩意呢&

    更多相关内容
  • 最近在各个平台上学习python爬虫技术,林林总总接触到了三大类型的爬虫技术——【1】利用urllib3实现,【2】使用Requests库实现,【3】使用Scrapy框架实现。 虽然是按照以上的顺序进行学习的,但是在学习scrapy的...
  • 解析Python网络爬虫:核心技术、Scrapy框架、分布式爬虫
  • 今天小编就为大家分享一篇关于Scrapy框架爬取Boss直聘网Python职位信息的源码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • scrapy 爬虫实战
  • 主要介绍了如何在django中运行scrapy框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了Python利用Scrapy框架爬取豆瓣电影,结合实例形式分析了Python使用Scrapy框架爬取豆瓣电影信息的具体操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
  • 使用scrapy框架模拟人人网登陆,使用scrapy框架来实现直接利用cookie来做状态维持
  • Scrapy框架.docx

    2020-05-08 20:29:28
    Scrapy框架简介以及构建图 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容...
  • 基于python scrapy框架抓取豆瓣影视资料
  • 请确保前文所讲的代理池、Cookies池已经实现并可以正常运行,安装Scrapy、PyMongo库。首先我们要实现用户的大规模爬取。这里采用的爬取方式是,以微博的几个大V为起始点,爬取他们各自的粉丝和关注列表,然后获取...
  • scrapy框架

    千次阅读 2021-11-17 22:47:53
    Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。同时能够以少量的代码帮助我们快速的抓取数据 scrapy的流程 爬虫中起始的url构造成request对象–>爬虫...

    scrapy的概念

    Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。同时能够以少量的代码帮助我们快速的抓取数据

    scrapy的流程

    在这里插入图片描述

    1. 爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器
    2. 调度器把request–>引擎–>下载中间件—>下载器
    3. 下载器发送请求,获取response响应---->下载中间件---->引擎—>爬虫中间件—>爬虫
    4. 爬虫提取url地址,组装成request对象---->爬虫中间件—>引擎—>调度器,重复步骤2
    5. 爬虫提取数据—>引擎—>管道处理和保存数据

    scrapy的三个内置对象

    • request请求对象:由url method post_data headers等构成
    • response响应对象:由url body status headers等构成
    • item数据对象:本质是个字典

    scrapy中每个模块的具体作用

    在这里插入图片描述

    • 引擎(engine): 负责数据和信号在不同模块间的传递
    • 调度器(scheduler): 实现一个队列,存放引擎发过来的request请求对象
    • 下载器(downloader): 发送引擎发过来的request请求,获取响应,并将响应交给引擎
    • 爬虫(spider): 处理引擎发过来的response,提取数据,提取url,并交给引擎
    • 管道(pipeline): 处理引擎传递过来的数据,比如存储
    • 下载中间件(downloader middleware): 可以自定义的下载扩展,比如设置代理ip。

    默认方法的作用:
    process_request(self, request, spider):

    1. 当每个request通过下载中间件时,该方法被调用。
    2. 返回None值:没有return也是返回None,该request对象传递给下载器,或通过引擎传递给其他权重低的proces当下载器完成http请求,传递响应给引擎的时候调用
    3. 返回Resposne:通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法
    4. 返回Request对象:通过引擎交给调取器继续请求,此时将不通过其他权重低的process_request方法s_request方法
    5. 返回Response对象:不再请求,把response返回给引擎
    6. 返回Request对象:把request对象通过引擎交给调度器,此时将不通过其他权重低的process_request方法

    使用IP代理:

    class ProxyMiddleware(object):
    	def process_request(self,request,spider):
    		# proxies可以在settings.py中,也可以来源于代理ip的webapi 
    		proxy = random.choice(proxies)
    		# 免费的会失效,报 111 connection refused 信息!重找一个代理ip再试
    		proxy = 'https://1.71.188.37:3128'
    		request.meta['proxy'] = proxy
    		return None # 可以不写return
    

    process_response(self, request, response, spider):
    在配置文件中启用中间件,权重值越小越优先启用。

    • 爬虫中间件(spider middleware): 可以自定义request请求和进行response过滤,与下载中间件作用重复

    安装scrapy

    yum install scrapy -y
    或者pip/pip3 install scrapy
    

    scrapy项目开发流程

    创建一个项目

    scrapy startproject Yourprojectname
    

    生成一个爬虫

    scrapy genspider yourspidername yourdomain
    

    yourspidername: 作为爬虫运行时的参数
    yourdomain: 为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。

    完善爬虫

    在/Yourprojectname/yourspidername /spiders/yourspidername.py中修改内容如下:

    import scrapy
    
    class ItcastSpider(scrapy.Spider):  # 继承scrapy.spider
    	# 爬虫名字 
        name = 'itcast' 
        # 允许爬取的范围
        allowed_domains = ['itcast.cn'] 
        # 开始爬取的url地址
        start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
        
        # 数据提取的方法,接收下载中间件传过来的response
        def parse(self, response): 
        	# scrapy的response对象可以直接进行xpath
        	names = response.xpath('//div[@class="tea_con"]//li/div/h3/text()') 
        	print(names)
    
        	# 获取具体数据文本的方式如下
            # 分组
        	li_list = response.xpath('//div[@class="tea_con"]//li') 
            for li in li_list:
            	# 创建一个数据字典
                item = {}
                # 利用scrapy封装好的xpath选择器定位元素,并通过extract()或extract_first()来获取结果
                item['name'] = li.xpath('.//h3/text()').extract_first() # 老师的名字
                item['level'] = li.xpath('.//h4/text()').extract_first() # 老师的级别
                item['text'] = li.xpath('.//p/text()').extract_first() # 老师的介绍
                print(item)
    

    注意:

    • scrapy.Spider爬虫类中必须有名为parse的解析
    • 如果网站结构层次比较复杂,也可以自定义其他解析函数
    • 在解析函数中提取的url地址如果要发送请求,则必须属于allowed_domains范围内,但是start_urls中的url地址不受这个限制,我们会在后续的课程中学习如何在解析函数中构造发送请求
    • 启动爬虫的时候注意启动的位置,是在项目路径下启动
    • parse()函数中使用yield返回数据,注意:解析函数中的yield能够传递的对象只能是:BaseItem, Request, dict, None

    一些API的作用

    1. response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
    2. 额外方法extract():返回一个包含有字符串的列表
    3. 额外方法extract_first():返回列表中的第一个字符串,列表为空没有返回None

    response响应对象的常用属性

    • response.url:当前响应的url地址
    • response.request.url:当前响应对应的请求的url地址
    • response.headers:响应头
    • response.requests.headers:当前响应的请求头
    • response.body:响应体,也就是html代码,byte类型
    • response.status:响应状态码

    pipeline保存数据

    管道能够实现数据的清洗和保存,能够定义多个管道实现不同的功能,使用管道pipeline来处理(保存数据),在pipelines.py文件中定义一个管道类,重写管道类的process_item方法,process_item方法处理完item之后必须返回给引擎。

    import json
    
    class JDPipeline():
        
        # 在爬虫开启的时候仅执行一次(想起了flask中的请求钩子)
        def open_spider(self, spider):
        	pass
        # 在爬虫关闭的时候仅执行一次
        def close_spider(self, spider):
        	pass
        # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
        # 该方法为固定名称函数,必须要用的函数
        def process_item(self, item, spider):
            # process_item的方法必须return item,否则后一个pipeline取到的数据为None值
            return item
    

    在settings.py配置启用管道:(可以开启多个管道)

    ITEM_PIPELINES = {
        'myspider.pipelines.ItcastPipeline': 400 #配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。
    }
    

    运行scrapy

    在项目目录下执行scrapy crawl yourspidername

    数据建模与请求

    建模的好处有如下几点:

    1. 定义item即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查
    2. 配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,在目标字段少的时候可以使用字典代替
    3. 使用scrapy的一些特定组件需要Item做支持,如scrapy的ImagesPipeline管道类,百度搜索了解更多

    在items.py文件中定义要提取的字段:

    class MyspiderItem(scrapy.Item): 
        name = scrapy.Field()
        title = scrapy.Field()
        desc = scrapy.Field()
    

    使用模板类:

    from myspider.items import MyspiderItem   # 导入Item,注意路径
        def parse(self, response)
    
            item = MyspiderItem() # 实例化后可直接使用
            item['name'] = node.xpath('./h3/text()').extract_first()
            item['title'] = node.xpath('./h4/text()').extract_first()
            item['desc'] = node.xpath('./p/text()').extract_first()
            print(item)
    

    实现翻页

    requests模块实现翻页请求:

    1. 找到下一页的URL地址
    2. 调用requests.get(url)

    scrapy实现翻页的思路:

    1. 找到下一页的url地址
    2. 构造url地址的请求对象,传递给引擎

    实现方法:
    3. 确定url地址
    4. 构造请求,scrapy.Request(url,callback)

    • callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析
    1. 把请求交给引擎:yield scrapy.Request(url,callback)
      在这里插入图片描述
      scrapy.Request的更多参数解释:
    scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
    
    1. 中括号里的参数为可选参数
    2. callback:表示当前的url的响应交给哪个函数去处理
    3. meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
    4. dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动
    5. method:指定POST或GET请求
    6. headers:接收一个字典,其中不包括cookies
    7. cookies:接收一个字典,专门放置cookies
    8. body:接收json字符串,为POST的数据,发送payload_post请求时使用(在下一章节中会介绍post请求)

    meta的作用:meta可以实现数据在不同的解析函数中的传递(把当前页面抓取到的数据传递给下一个parse函数进行进一步处理)

    注意:

    1. meta参数是一个字典
    2. meta字典中有一个固定的键proxy,表示代理ip

    分布式爬虫scrapy-redis

    三个类:

    RFPDupeFilter:实现了对request对象的加密
    RedisPipeline:进行数据的保存,存入了redis中
    Scheduler:实现了决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉

    ettings.py中关键的配置“

    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    SCHEDULER_PERSIST = True
    
    ITEM_PIPELINES = {
        'example.pipelines.ExamplePipeline': 300,
        'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    REDIS_URL = "redis://127.0.0.1:6379"
    

    scrapy_redis的流程

    • 在scrapy_redis中,所有的待抓取的request对象和去重的request对象指纹都存在所有的服务器公用的redis中

    • 所有的服务器中的scrapy进程公用同一个redis中的request对象的队列

    • 所有的request对象存入redis前,都会通过该redis中的request指纹集合进行判断,之前是否已经存入过

    • 在默认情况下所有的数据会保存在redis中

    使用:

    爬虫文件:

    import scrapy
    from scrapy_redis.spiders import RedisSpider
    
    
    class RdsDoubSpider(RedisSpider):
        """分布式爬虫"""
        name = 'rds_doub'
        redis_key = 'rds_douban_url'
    
        # allowed_domains = ['douban.com']
        # start_urls = ['http://douban.com/']
        def __init__(self, *args, **kwargs):
            # Dynamically define the allowed domains list.
            domain = kwargs.pop('domain', '')
            self.allowed_domains = list(filter(None, domain.split(',')))
            super(RdsDoubSpider, self).__init__(*args, **kwargs)
    
        def parse(self, response):
            node_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]')
    
            for data in node_list:
                item = {}
                item['name'] = data.xpath('./div/a/span[1]/text()').extract_first()
                item['actor'] = data.xpath('./div/p[1]/text()').extract_first().strip()
                item['score'] = data.xpath('./div/div/span[@class="rating_num"]/text()').extract_first()
                item['desc'] = data.xpath('./div/p/span/text()').extract_first()
                yield item
    
            # # 获取翻页url
            part_url = response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[3]/a/@href').extract_first()
    
            if part_url is not None:
                url = response.urljoin(part_url)
                # 构建请求返回
                # callbock:当翻页的页面结构不发生改变依旧可以解析可以写当前的parse方法
                yield scrapy.Request(url=url,
                                     callback=self.parse)
    
    

    启动方式

    scrapy crawl spider 
    

    往redis中添加起始URL

    127.0.0.1:6379> lpush rds_douban_url https://xxx.com250
    

    scrapy_splash

    scrapy_splash是scrapy的一个组件,是一个Javascript渲染服务。它实现了HTTP API的轻量级浏览器,Splash是用Python和Lua语言实现的,基于Twisted和QT等模块构建。使用scrapy-splash最终拿到的response相当于是在浏览器全部渲染完成以后的网页源代码。

    环境安装:

    docker pull scrapinghub/splash
    # 运行镜像成为一个容器
    docker run -d -p 8050:8050 scrapinghub/splash
    

    安装splash

    pip install scrapy-splash
    

    使用splash

    import scrapy
    from scrapy_splash import SplashRequest # 使用scrapy_splash包提供的request对象
    
    class WithSplashSpider(scrapy.Spider):
        name = 'with_splash'
        allowed_domains = ['baidu.com']
        start_urls = ['https://www.baidu.com/s?wd=13161933309']
    
        def start_requests(self):
            yield SplashRequest(self.start_urls[0],
                                callback=self.parse_splash,
                                args={'wait': 10}, # 最大超时时间,单位:秒
                                endpoint='render.html') # 使用splash服务的固定参数
    
        def parse_splash(self, response):
            with open('with_splash.html', 'w') as f:
                f.write(response.body.decode())
    

    settings.py

    SPLASH_URL = 'http://127.0.0.1:8050'
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
    

    scrapy_redis和scrapy_splash配合使用的配置

    # 渲染服务的url
    SPLASH_URL = 'http://127.0.0.1:8050'
    # 下载器中间件
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    # 使用Splash的Http缓存
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
    
    # 去重过滤器
    # DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    # DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 指纹生成以及去重类
    DUPEFILTER_CLASS = 'test_splash.spiders.splash_and_redis.SplashAwareDupeFilter' # 混合去重类的位置
    
    SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 调度器类
    SCHEDULER_PERSIST = True # 持久化请求队列和指纹集合, scrapy_redis和scrapy_splash混用使用splash的DupeFilter!
    ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400} # 数据存入redis的管道
    REDIS_URL = "redis://127.0.0.1:6379" # redis的url
    

    部署scrapy项目

    scrapyd介绍

    scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API来部署爬虫项目和控制爬虫运行,scrapyd是一个守护进程,监听爬虫的运行和请求.

    scrapyd的安装

    scrapyd服务:(在服务器安装)
    pip install scrapyd

    scrapyd客户端:(在客户端安装)
    pip install scrapyd-client

    scrapyd的配置文件

    # [root@scrapy gerapy]# vim /etc/scrapyd/scrapyd.conf
    [scrapyd]
    eggs_dir    = eggs
    logs_dir    = logs
    items_dir   =
    jobs_to_keep = 5
    dbs_dir     = dbs
    max_proc    = 0
    max_proc_per_cpu = 4
    finished_to_keep = 100
    poll_interval = 5.0
    bind_address = 127.0.0.1
    http_port   = 6800
    debug       = off
    runner      = scrapyd.runner
    application = scrapyd.app.application
    launcher    = scrapyd.launcher.Launcher
    webroot     = scrapyd.website.Root
    
    [services]
    schedule.json     = scrapyd.webservice.Schedule
    cancel.json       = scrapyd.webservice.Cancel
    addversion.json   = scrapyd.webservice.AddVersion
    listprojects.json = scrapyd.webservice.ListProjects
    listversions.json = scrapyd.webservice.ListVersions
    listspiders.json  = scrapyd.webservice.ListSpiders
    delproject.json   = scrapyd.webservice.DeleteProject
    delversion.json   = scrapyd.webservice.DeleteVersion
    listjobs.json     = scrapyd.webservice.ListJobs
    daemonstatus.json = scrapyd.webservice.DaemonStatus
    

    启动scrapyd服务

    1. 在scrapy项目路径下 启动scrapyd的命令:sudo scrapydscrapyd

    2. 启动之后就可以打开本地运行的scrapyd,浏览器中访问本地6800端口可以查看scrapyd的监控界面

    部署爬虫项目到scrapyd

    编辑scrapy.cfg文件:

    在这里插入图片描述

    在这里插入图片描述
    注意 -p选项的名称可随意,如果部署到服务器(gerapy)报错,修改代码重新部署

    管理scrapy项目
    启动项目:
    curl http://localhost:6800/schedule.json -d project=project_name -d spider=spider_name
    在这里插入图片描述

    关闭项目:
    curl http://localhost:6800/cancel.json -d project=project_name -d job=jobid

    使用requests模块控制scrapy项目

    import requests
    
    # 启动爬虫
    url = 'http://localhost:6800/schedule.json'
    data = {
    	'project': 项目名,
    	'spider': 爬虫名,
    }
    resp = requests.post(url, data=data)
    
    # 停止爬虫
    url = 'http://localhost:6800/cancel.json'
    data = {
    	'project': 项目名,
    	'job': 启动爬虫时返回的jobid,
    }
    resp = requests.post(url, data=data)
    

    小结

    1. 在scrapy项目路径下执行sudo scrapydscrapyd,启动scrapyd服务;或以后台进程方式启动nohup scrapyd > scrapyd.log 2>&1 &
    2. 部署scrapy爬虫项目scrapyd-deploy -p myspider
    3. 启动爬虫项目中的一个爬虫`curl http://localhost:6800/schedule.json -d project=myspider -d spider=tencent

    使用gerapy管理爬虫项目

    Gerapy 是一款 分布式爬虫管理框架,支持 Python 3,基于 Scrapy、Scrapyd、Scrapyd-Client、Scrapy-Redis、Scrapyd-API、Scrapy-Splash、Jinjia2、Django、Vue.js 开发,Gerapy 可以帮助我们:

    1. 更方便地控制爬虫运行
    2. 更直观地查看爬虫状态
    3. 更实时地查看爬取结果
    4. 更简单地实现项目部署
    5. 更统一地实现主机管理

    Gerapy的安装:

    pip3 install gerapy
    

    验证是否安装成功

    在这里插入图片描述

    初始化一个项目:

    gerapy init
    # 进入gerapy项目对数据库进行迁移
    [root@scrapy gerapy]# gerapy migrate
    

    在这里插入图片描述
    创建一个超级用户

    在这里插入图片描述
    启动服务:

    在这里插入图片描述
    创建主机
    在这里插入图片描述
    项目部署:

    只需把项目文件夹上传至gerapy下的project目录下即可。

    展开全文
  • 引言:使用pip install 来安装scrapy需要安装大量的依赖库,这里我使用了Anaconda来安装scrapy,安装时只需要一条语句:conda install scrapy即可 步骤1:安装Anaconda,在cmd窗口输入:conda install scrapy ,输入...
  • 简述python Scrapy框架

    2020-09-16 09:54:26
    主要介绍了python Scrapy框架的相关资料,帮助大家开始学习python 爬虫,感兴趣的朋友可以了解下
  • 在本篇内容中我们给大家整理了关于python安装Scrapy框架的图文详细步骤,需要的朋友们跟着学习下。
  • 使用scrapy框架爬中国省市地区数据,5级页面
  • 第一部分爬虫架构介绍 1.Spiders(自己书写的爬虫逻辑,处理url及网页等【spider genspider -t 指定模板 爬虫文件名 域名】),返回Requests给engine——> 2.engine拿到requests返回给scheduler(什么也没做)——> ...
  • 爬虫scrapy框架小实例

    2019-10-16 11:23:32
    爬虫scrapy框架小实例,在dos窗口项目所在目录,使用scrapy crawl basic 直接爬取,显示内容和网站的内容一样。
  • Python爬爬虫虫实实例例scrapy框框架架爬爬取取拉拉勾勾网网招招聘聘信信息息 这篇文章主要介绍了Python爬虫实例scrapy框架爬取拉勾网招聘信息的相关资料文中讲解非常细致代码 助大家更好的理解和学习感兴趣的朋友...
  • python 的scrapy框架

    千次阅读 2022-04-07 09:51:07
    目标:AI设计基础–采集数据 作为AI算法工程师,面对...重点学习scrapy框架,学会灵活使用这个工具。 学习内容: scrapy框架的使用给我的感觉和Django框架的应用差不多。 本节将简要介绍Scrapy的安装,命令和实现过程

    目标:AI设计基础–采集数据

    作为AI算法工程师,面对新需求,明明方法千万条,数据没一条。老是为了做一个功能,费尽心思求数据而不得,或找到现有数据集不理想,匹配度不高。本文就学习一下怎样快速下载数据资源(资源:文字文章,图像,影像)。

    1. 数据不求人
    2. 熟悉网页请求库,urllib,requests,beautiful soup。
    3. 重点学习scrapy框架,学会灵活使用这个工具。

    学习内容:

    scrapy框架的使用给我的感觉和Django框架的应用差不多。
    本节将简要介绍Scrapy的安装,命令和实现过程。

    安装

    Scrapy:Scrapy是用 Python 写的。采用虚拟环境安装,一行代码自动匹配安装依赖库。
    安装:conda install -c conda-forge scrapy
    其他方式安装,手动匹配安装一下依赖库。
    安装依赖库
    lxml 一个高效的XML和HTML解析器
    parsel ,一个写在lxml上面的html/xml数据提取库,
    w3lib ,用于处理URL和网页编码的多用途帮助程序
    twisted 异步网络框架
    cryptographypyOpenSSL ,处理各种网络级安全需求

    基础命令

    Scrapy工具提供了多个命令,用于多种目的,每个命令接受一组不同的参数和选项。
    scrapy <command> -h 查看命令使用方法的帮助
    scrapy -h 框架使用帮助
    全局命令
    startproject新建项目; genspider ;settings;runspider;shell;fetch;view;version
    仅Project命令
    crawl爬;check;list;edit;parse;bench
    在这里插入图片描述

    提升示例

    也可以参见入门教程:入门教程:https://www.osgeo.cn/scrapy/intro/tutorial.html

    1. scrapy startproject <project_name> [project_dir]
      创建一个名为 project_name 下 project_dir 目录。如果 project_dir 没有指定, project_dir 将与 project_name .

      例如:虚拟环境Anaconda3下切换到对应的虚拟环境,activate web。输入:scrapy startproject spider_one新建一个项目。
      在这里插入图片描述
      目录包含以下内容:
      在这里插入图片描述
      创建一只爬虫蜘蛛,就是在spider里面新建一个继承scrapy.Spider的类。以访问名字方式使用。
      spiders文件夹下就是装有蜘蛛的.py文件了。xx就是我自己建的两个不同类型蜘蛛。(注,不以文件名为蜘蛛数,以继承的scrapy.Spider类为计)
      conda命令行处,cd spider_one,后切换IDE.
      使用pycharm打开项目,将项目的环境设置为当前安装了scrapy的虚拟环境。
      在这里插入图片描述
      scrapy手册实例之爬取网站名人名言scrapy startproject spider_one
      专门用来举例爬虫框架的一个网站网址:http://quotes.toscrape.com/
      代码都很简单,这里需要重点说明的有两点:一是两种选择器:css,xpath,二是翻页与重组网址使用的4种方法。

      源码:spiders文件见下的quotes_spider.py:

      # !/usr/bin/env python
      # -*- coding: utf-8 -*-
      # @Time    : 2022/3/23 15:41
      # @Author  : Haiyan Tan
      # @Email   : 893190391@qq.com 
      # @File    : quotes_spider.py
      
      # Begin to show your code!
      import scrapy  # 如何使用scrappy跟踪链接和回调的机制
      
      
      class QuotesSpider(scrapy.Spider):
          name = "quotes"  # 标识蜘蛛.它在一个项目中必须是唯一的,即不能为不同的爬行器设置相同的名称。使用时:scrapy crawl quotes
      
          # 创建一个可以返回请求列表或编写生成器的函数
          def start_requests(self):
              urls = [
                  'http://quotes.toscrape.com/page/1/',
                  # 'http://quotes.toscrape.com/page/2/',
              ]
              for url in urls:  # 爬行器将从该请求开始爬行。后续请求将从这些初始请求中相继生成。
                  yield scrapy.Request(url, callback=self.parse)  # 实例化 Response 对象,并调用与请求关联的回调方法(parse 方法)将响应作为参数传递。
      
          def parse(self, response, **kwargs):  # parse()是Scrapy的默认回调方法
              page = response.url.split('/')[-2]
              # filename = f'quote-{page}.html'
              # with open(filename, 'wb') as f:
              #     f.write(response.body)
              # self.log(f'Saved file {filename}')
              for quote in response.css('div.quote'):
                  yield {
                      'text': quote.css('span.text::text').get(),
                      'author': quote.css('small.author::text').get(),
                      'tags': quote.css('div.tags a.tag::text').getall(),
                  }
      
                  next_page = response.css('li.next a::attr(href)').get()
                  if next_page is not None:
                      # 递归地跟踪下一页的链接 4种方法 方法1
                      # next_page = response.urljoin(next_page)
                      # yield scrapy.Request(next_page, callback=self.parse)
      
                      # 方法2
                      # 不像Scrapy.Request, response.follow 直接支持相对URL-无需调用URLJOIN。
                      yield response.follow(next_page, callback=self.parse)  # 创建请求对象的快捷方式
      
                      # 要从iterable创建多个请求  方法3
                      # anchors = response.css('ul.pager a')
                      # yield from response.follow_all(anchors, callback=self.parse)
      
                      # 等价于 方法4
                      # yield from response.follow_all(css='ul.pager a', callback=self.parse)
      
      
       next_page = response.css('li.next a::attr(href)').get()
                  if next_page is not None:
      

      递归地跟踪下一页的链接 4种方法
      方法1:
      next_page = response.urljoin(next_page)
      yield scrapy.Request(next_page, callback=self.parse)

      方法2: response.follow 直接支持相对URL-无需调用URLJOIN。
      yield response.follow(next_page, callback=self.parse) # 创建请求对象的快捷方式

      方法3:通过iterable创建多个请求
      anchors = response.css('ul.pager a')
      yield from response.follow_all(anchors, callback=self.parse)

      方法4:等价于方法3
      yield from response.follow_all(css='ul.pager a', callback=self.parse)

      settings.py的修改

      BOT_NAME = 'spider_one'
      
      SPIDER_MODULES = ['spider_one.spiders']
      NEWSPIDER_MODULE = 'spider_one.spiders'
      
      LOG_LEVEL = 'ERROR'
      # Crawl responsibly by identifying yourself (and your website) on the user-agent
      USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
      
      # Obey robots.txt rules
      ROBOTSTXT_OBEY = True
      
    2. 运行蜘蛛:scrapy crawl <spider>
      scrapy crawl quotes # 第三步,运行抓取name= quotes
      或者:scrapy runspider quotes_spider.py -o quotes.jl

    更多详细信息,请参考scrapy的使用手册

    进阶使用:多页取图

    取图片是取文字信息的流程上加入管道和图像保存机制。
    取网站:主页:https://699pic.com/
    搜对象狗的网址:https://699pic.com/tupian/photo-gou.html

    1. 首先在items.py里定义图像命名,图像网址等字段。
      items.py

      import scrapy
      
      class MyImagesItem(scrapy.Item):
          # define the fields for your item here like:
          # name = scrapy.Field()
          image_urls = scrapy.Field()
          images = scrapy.Field()
          image_path = scrapy.Field()
      
    2. 在设置文件settings.py 新增或设定配置信息。
      设置图片保存的路径,项目保存的最长时间90,设置的图片尺寸大小。设置管道。

      # Configure item pipelines
      # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
      # 图像、管道
      ITEM_PIPELINES = {
          'spider_one.pipelines.ImgPipeline': 300,
          # 'scrapy.pipelines.images.ImagesPipeline': 1,
      }
      # 设置图片保存的路径,项目保存的最长时间90,设置的图片尺寸大小
      IMAGES_STORE = r'E:\\Datasets\\obj_detect_data\\scrapy_images_0325\\'
      IMAGES_EXPIRES = 90
      IMAGES_MIN_HEIGHT = 100
      IMAGES_MIN_WIDTH = 100
      
    3. 定义管道pipelines.py

      # Define your item pipelines here
      #
      # Don't forget to add your pipeline to the ITEM_PIPELINES setting
      # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
      
      
      # useful for handling different item types with a single interface
      import scrapy
      from itemadapter import ItemAdapter
      from scrapy.pipelines.images import ImagesPipeline
      from scrapy.exceptions import DropItem
      
      
      class ImgPipeline(ImagesPipeline):
          def get_media_requests(self, item, info):
              return [scrapy.Request(x) for x in item.get(self.images_urls_field, [])]
      
          def item_completed(self, results, item, info):
              if isinstance(item, dict) or self.images_result_field in item.fields:
                  item[self.images_result_field] = [x for ok, x in results if ok]
      
              return item
      
    4. 最后,在spiders文件夹下定义取图片的蜘蛛。img_spider.py

      # !/usr/bin/env python
      # -*- coding: utf-8 -*-
      # @Time    : 2022/3/24 16:29
      # @Author  : Haiyan Tan
      # @Email   : 893190391@qq.com 
      # @File    : img_spider.py
      
      # Begin to show your code!
      import scrapy
      from ..items import *
      
      
      class ImgSpider(scrapy.Spider):
          name = 'imgspider'
          allowd_domains = ['699pic.com', ]
          start_urls = [
              'https://699pic.com/tupian/photo-gou.html',
          ]
      
          def parse(self, response, **kwargs):
              items = MyImagesItem()
              # items['image_urls'] = [response.urljoin(response.xpath('//a/img/@data-original').get())]
              items['image_urls'] = response.xpath('//a/img/@data-original').getall()
              for i, urls in enumerate(items['image_urls']):
                  items['image_urls'][i] = response.urljoin(urls)
              yield items
              yield from response.follow_all(xpath='//div[@class="pager-linkPage"]/a/@href', callback=self.parse)
              # next_page = response.xpath('//div[@class="pager-linkPage"]/a/@href').get()
      
    5. 运行项目:scrapy crawl --nolog imgspider
      取图片数目:24527张
      在这里插入图片描述


    Debug:scrapy ERROR: Error processing {'image_urls':

    原因:Scrapy tryies to process your string as a list of image URLs:
    修改与这个test_item['image_urls'] = [image_urls]一致。

    Debug:ValueError: Missing scheme in request url:

    scrapy会对request的URL去重(RFPDupeFilter),加上dont_filter则告诉它这个URL不参与去重。
    两种方法能够使 requests 不被过滤:

    • 在 allowed_domains 中加入 url
    • 在 scrapy.Request() 函数中将参数 dont_filter=True 设置为 True
      意思就是,scrapy可能会处于一些原因把没有问题的url过滤掉,我们只有加上这样的命令才能防止丢失。
    展开全文
  • 在这个教材中,我们假定你已经安装了Scrapy。假如你没有安装,你可以参考这个安装指南。 我们将会用开放目录项目(dmoz)作为我们例子去抓取。 这个教材将会带你走过下面这几个方面: 创造一个新的Scrapy项目 定义您将...
  • 【爬虫应用教程】-scrapy框架的学习.pptx
  • Scrapy框架介绍

    2022-07-26 15:37:53
    1)scrapy是python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。2)scrapy用途广泛,可以用于数据挖掘、监测和自动化测试、信息处理和历史档案等大量应用范围内抽取...

    目录

    1.介绍

    2.为什么要用scrapy

    3.scrapy的特点

    4.优点

    5.流程图


    1.介绍

    1)scrapy是python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。scrapy=scrach+python

    2)scrapy用途广泛,可以用于数据挖掘、监测和自动化测试、信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于企业

    3)scrapy使用twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。scrapy是由twisted写的一个受欢迎的python事件驱动网络框架,他使用的是非堵塞的异步处理

    2.为什么要用scrapy

    1.更容易构建和大规模的抓取项目

    2.内置的机制被称为选择器,用于从网站(网页)上提取数据

    3.异步处理请求,速度非常快

    4.可以使用自动调节机制自动调整爬行速度

    5.确保开发人员可访问性

    3.scrapy的特点

    1.是一个开源、免费使用的网络爬虫框架

    2.scrapy生成格式导出如: JSON、CSV、XML

    3.内置之处从源代码,使用xpath或者css选择器来提取数据

    4.scrapy基于爬虫,允许以自动方式从网页中提取数据

    4.优点

    1.很容易扩展,速度快,功能强大

    2.这是一个跨平台应用程序框架

    3.scrapy请求调度和异步处理

    4.scrapy附带了一个名为scrapyd的内置服务,允许使用JSON web服务上的项目和控制蜘蛛

    5.能够刮削任何网站,即使该网站不具有元素数据访问api

    5.流程图

    手写:

     

     scrapy engine(引擎):否则spider、itempipeline、Downloader、scheduler中间的通讯,信号、数据传递等。

    scheduler(调度器):负责接受 引擎 发送过来的request请求,并按照一定的方式进行整理排序,入队,当 引擎 需要时,交还给 引擎

    Downloader(下载器):负责下载 引擎 发送的所有request请求,并将其获取到的response交还给 引擎 ,由 引擎 交给 spider 来处理

    spider(爬虫):负责处理所有response,从中分析提取数据,获取item字段需要的数据,并将需要跟进的url提交给 引擎 ,再次进入 调度器

    item pipeline(管道):负责处理 spider 中获取到的item,并进行后期处理(详细分析、过滤、存储等)的地方

    Downloader middlewares(下载中间件):可以当做是一个可以自定义扩展下载功能的组件

    spider middlewares(spider中间件):可以理解为是一个可以自定义扩展和操作 引擎spider 中间 通信 的功能组件(比如进入 spider 的response和从 spider 出去的request)

    最简单的单个网页爬取流程是: spiders ->scheduler -> downloader -> spiders -> item pipeline

    注意!只用当 调度器  中不存在如何request了,整个程序才会停止,也就是说,对于下载失败的url,scrapy也会重新下载。

    展开全文
  • Python爬虫之Scrapy框架(案例练习)

    多人点赞 热门讨论 2022-08-09 14:01:19
    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API...
  • 搭建scrapy框架

    2022-06-09 23:20:07
    搭建scrapy
  • 主要介绍了Python3爬虫爬取英雄联盟高清桌面壁纸功能,结合实例形式分析了基于Scrapy爬虫框架进行图片爬取的相关项目创建、文件结构、功能实现操作技巧与注意事项,需要的朋友可以参考下
  • Scrapy框架入门

    2022-04-03 15:38:24
    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。 Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试. 其最初是为了页面抓取 (更确切来说, 网络抓取...
  • python scrapy框架讲解

    2018-02-05 15:07:48
    python scrapy框架从零基础开始讲解 内有例子 关于python的别的方面的可以去我的资源页下载
  • Scrapy爬虫框架的入门案例,感受一下Scrapy的强大之处。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,614
精华内容 16,245
关键字:

scrapy框架