scrapy_scrapyd - CSDN
scrapy 订阅
Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 [1]  Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。 [2] 展开全文
Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 [1]  Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。 [2]
信息
外文名
scrapy
基本功能
数据挖掘
特    点
应用框架
中文名
抓取
应    用
数据挖掘、监测和自动化测试
scrapy基本功能
Scrapy是一个适用爬取网站数据、提取结构性数据的应用程序框架,它可以应用在广泛领域:Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。 [3]  尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。
收起全文
精华内容
参与话题
  • 从零开始学scrapy网络爬虫

    千人学习 2020-02-01 10:11:25
    《从零开始学Scrapy网络爬虫》从零开始,循序渐进地介绍了目前流行的网络爬虫框架Scrapy。即使你没有任何编程基础,学习起来也不会有压力,因为我们有针对性地介绍了Python编程技术。另外,《从零开始学Scrapy网络...
  • python3+Scrapy爬虫实战(一)—— 初识Scrapy

    万次阅读 多人点赞 2018-07-02 16:36:29
    目录 目录 初识Scrapy 开发环境 创建项目 创建爬虫 ...初识Scrapy ...本人是一名Scrapy的爱好者和初学者,写这文章主要是为了加深对Scrapy的了解,如果文章中有写的不对或者有更好的方式方...
    
    
    

    转载请注明作者和出处:https://blog.csdn.net/finn_wft/article/details/80881946

    初识Scrapy

    本人是一名Scrapy的爱好者和初学者,写这文章主要是为了加深对Scrapy的了解,如果文章中有写的不对或者有更好的方式方法欢迎大家指出,一起学习。

    开发环境

    运行平台:Windows 10
    Python版本:Python 3.6.1
    Scrapy版本:Scrapy 1.4.0
    IDE:Sublime text3
    浏览器:chrome


    下面我们进入本文的主题,爬取我们的第一个网页“去哪儿”的酒店城市列表,图中红色框框部门。
    这里写图片描述

    创建项目

    scrapy startproject qunar

    这里写图片描述
    红框中是指出创建一个新爬虫。

    创建爬虫

    cd qunar
    scrapy genspider hotel bnb.qunar.com

    这里写图片描述
    自此,我们的项目算是基本创建好了,其中“hotel”是指爬虫的名称,“bnb.qunar.com”爬虫的域名。不过为了方便我们项目启动,可以在项目中新建一个entrypoint.py文件,文件内容如下:
    这里写图片描述

    项目结构图

    这里写图片描述

    创建Item

    创建一个新的Item方便我们保存所爬取的数据,从爬取的页面中可以看出,我们需要两个数据就够了,一个是城市名称,另一个是城市对应的URL。
    下面我们就来创建保存这两个数据Item:
    这里写图片描述
    上面QunarItem是由scrapy自动生成出来的,我们暂时先不管它,如果你想直接用系统创建的那个Item也是可以的。我这里是自己新创建一个,看起来比较好管理。

    分析HTML

    按F12进入开发者工具,在按Ctrl + Shift + c 进入元素查找状态,找到包裹我们要爬取内容的div,如图下所示:
    这里写图片描述
    从图中可以看出,A~Z分别在一个div中,所以我们只要解析出一个div那其他25个div也就解析出来了。然后,我们在从右侧中一层一层点进去,找到第一个城市“阿坝”,如下图所示:
    这里写图片描述
    通过对图的观察,可以发现,我们首先要找到包裹所以内容class=”b_allcity”的div,在从这个div中找到所有class=”e_city_list”的div,在从中找到所有“li”标签中的“a”标签,爬取“a”标签中的文本及“href”属性。

    item我们已经创建好了,对HTML页面也进行了分析,下面就可以进入主题了“爬虫”,有点小激动。

    爬取网页

    打开spiders中的hotel.py文件。这文件是系统帮我们创建的,系统帮我们创建了一下关键代码。如图
    这里写图片描述
    下面我们只要对这么代码稍稍改动一点,并写出之前我们对HTML解析的代码就好了。如图:
    这里写图片描述
    本文中我使用的是“BeautifulSoup”来对HTML代码进行解析的,如果有没装“BeautifulSoup”的小伙伴可以在命令窗口中直接安装,安装代码:

    pip install bs4

    写到这里,代码就已经写完了,下面我们就来运行起来看看效果如何。
    在命令窗口输入:

    python entrypoint.py

    这里写图片描述
    结果:
    这里写图片描述
    从图中可以看出,我们要爬取的内容已经被我们爬取出来了。是不是觉得“so easy”呀!!!

    文中代码部分都是用图片的,目的是希望小伙伴们可以直接上手自己敲,代码只有敲多了才能记得更牢,才能学的更快。
    本文源代码会在下面给出,如果有什么不懂的地方可以直接下载源代码查看。
    因为本人也是一名初学者,如果有什么好的建议欢迎大家在评论中写出,大家一起学习!

    源代码下载

    CSDN下载

    展开全文
  • scrapy 快速入门

    万次阅读 多人点赞 2017-04-14 01:18:38
    安装ScrapyScrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。首先我们安装Scrapy。pip install scrapy在Windows上安装时可能会出现错误,提示找不到...

    安装Scrapy

    Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。

    首先我们安装Scrapy。

    pip install scrapy

    在Windows上安装时可能会出现错误,提示找不到Microsoft Visual C++。这时候我们需要到它提示的网站visual-cpp-build-tools下载VC++ 14编译器,安装完成之后再次运行命令即可成功安装Scrapy。

    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    快速开始

    第一个爬虫

    以下是官方文档的第一个爬虫例子。可以看到,和我们手动使用request库和BeautifulSoup解析网页内容不同,Scrapy专门抽象了一个爬虫父类,我们只需要重写其中的方法,就可以迅速得到一个可以不断爬行的爬虫。

    import scrapy
    
    
    class QuotesSpider(scrapy.Spider):
        name = "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=url, callback=self.parse)
    
        def parse(self, response):
            page = response.url.split("/")[-2]
            filename = 'quotes-%s.html' % page
            with open(filename, 'wb') as f:
                f.write(response.body)
            self.log('Saved file %s' % filename)

    上面的爬虫有几个地方需要解释一下:

    • 爬虫类的name属性,用来标识爬虫,该名字在一个项目必须是唯一的。
    • start_requests()
      方法,必须返回一个可迭代的列表(可以是列表,也可以是生成器),Scrapy会从这些请求开始抓取网页。
    • parse()
       方法用于从网页文本中抓取相应内容,我们需要根据自己的需要重写该方法。

    开始链接

    在上面的例子中使用start_requests()方法来设置起始URL,如果只需要简单指定URL还可以使用另一种简便方法,那就是设置类属性start_urls,Scrapy会读取该属性来设置起始URL。

    import scrapy
    
    
    class QuotesSpider(scrapy.Spider):
        name = "quotes"
        start_urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]

    提取数据

    这部分的练习可以使用Scrapy的shell功能。我们可以使用下面的命令启动Scrapy shell并提取百思不得姐段子的内容,成功运行之后会打开一个交互式shell,我们可以进行交互式编程,随时查看代码的运行结果。

    scrapy shell 'http://www.budejie.com/text/'

    可能会出现下面的错误,遇到这种情况是因为没有安装pypiwin32模块。

    ModuleNotFoundError: No module named 'win32api'

    这时候可以使用下面的命令安装。

    pip install pypiwin32

    运行成功之后在终端中看到以下内容,列举了在交互式shell中可以进行的操作。

    [s] Available Scrapy objects:
    [s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
    [s]   crawler    <scrapy.crawler.Crawler object at 0x0000014EA8B3CD68>
    [s]   item       {}
    [s]   request    <GET http://www.budejie.com/text/>
    [s]   response   <200 http://www.budejie.com/text/>
    [s]   settings   <scrapy.settings.Settings object at 0x0000014EA8B3CA58>
    [s]   spider     <DefaultSpider 'default' at 0x14ea8dc07f0>
    [s] Useful shortcuts:
    [s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
    [s]   fetch(req)                  Fetch a scrapy.Request and update local objects
    [s]   shelp()           Shell help (print this help)
    [s]   view(response)    View response in a browser

    例如,如果我们要查看网页的内容,可以输入view(response),会打开默认浏览器并进入相应页面。

    In [2]: view(response)
    Out[2]: True

    如果需要使用CSS选择器提取网页内容,可以输入相应的内容,比如说下面就获取了网页上的标题标签。

    In [3]: response.css('title')
    Out[3]: [<Selector xpath='descendant-or-self::title' data='<title>内涵段子_内涵笑话-百思不得姐官网,第1页</title>'>]

    如果需要提取标签内容,可以使用Scrapy扩展的CSS选择器::text并使用extract()方法。如果直接对标签调用extract()会获取包含标签在内的整个文本。

    In [8]: response.css('title::text').extract()
    Out[8]: ['内涵段子_内涵笑话-百思不得姐官网,第1页']

    如果选中的标签含有复数内容,可以使用extract_first()方法获取第一个元素。

    response.css('title::text').extract_first()

    也可以使用索引来选取内容。不过假如没有元素的话,extract_first()方法会返回None而索引会抛出IndexError,因此使用extract_first()更好。

    response.css('title::text')[0].extract()

    除了CSS选择器之外,Scrapy还支持使用re方法以正则表达式提取内容,以及xpath方法以XPATH语法提取内容。关于XPATH,可以查看菜鸟教程,写的还不错。

    下面是提取百思不得姐段子的简单例子,在交互环境中执行之后,我们就可以看到提取出来的数据了。

    li=response.css('div.j-r-list-c-desc')
    content=li.css('a::text')

    编写爬虫

    确定如何提取数据之后,就可以编写爬虫了。下面的爬虫爬取了百思不得姐首页的用户名和段子。

    class Baisibudejie(scrapy.Spider):
        name = 'jokes'
        start_urls = ['http://www.budejie.com/text/']
    
        def parse(self, response):
            lies = response.css('div.j-r-list >ul >li')
            for li in lies:
                username = li.css('a.u-user-name::text').extract()
                content = li.css('div.j-r-list-c-desc a::text').extract()
                yield {'username': username, 'content': content}

    写好了爬虫之后,就可以运行了。我们可以使用下面的命令运行这个爬虫。运行成功之后,会出现user.json,其中就是我们爬取的数据。Scrapy支持多种格式,除了json之外,还可以将数据导出为XML、CSV等格式。

    scrapy runspider use_scrapy.py -o user.json
    

    页面跳转

    如果爬虫需要跨越多个页面,需要在parse方法中生成下一步要爬取的页面。下面的例子是爬取我CSDN博客所有文章和连接的爬虫。这个爬虫没有处理CSDN博客置顶文章,所以置顶文章爬取的文章标题是空。

    class CsdnBlogSpider(scrapy.Spider):
        name = 'csdn_blog'
        start_urls = ['http://blog.csdn.net/u011054333/article/list/1']
    
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.base_url = 'http://blog.csdn.net'
    
        def parse(self, response):
            articles = response.css('div#article_list div.article_item')
            for article in articles:
                title = article.css('div.article_title a::text').extract_first().strip()
                link = self.base_url + article.css('div.article_title a::attr(href)').extract_first().strip()
                yield {'title': title, 'link': link}
    
            pages = response.css('div#papelist')
            next_page_url = pages.css('a').re_first('<a href=\"(.*)\">下一页')
            if next_page_url is not None:
                yield scrapy.Request(urllib.parse.urljoin(self.base_url, next_page_url))
    

    scrapy命令

    为了更好的实现工程化管理,Scrapy还提供了scrapy命令来帮助我们管理爬虫。详细的命令用法请参考官方文档

    创建项目

    下面的命令可以创建一个Scrapy爬虫项目,它为我们规定了标准的项目格式。

    scrapy startproject myproject [project_dir]

    创建好之后,应该会出现如下的项目结构。spiders模块中放置所有爬虫,scrapy.cfg是项目的全局配置文件,其余文件是Scrapy的组件。

    项目结构

    创建爬虫

    使用下面的命令可以创建一个爬虫,爬虫会放置在spider模块中。

    scrapy genspider mydomain mydomain.com

    生成的爬虫具有基本的结构,我们可以直接在此基础上编写代码。

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class MydomainSpider(scrapy.Spider):
        name = "mydomain"
        allowed_domains = ["mydomain.com"]
        start_urls = ['http://mydomain.com/']
    
        def parse(self, response):
            pass
    

    运行爬虫

    在已经生成好的项目中,我们使用项目相关的命令来运行爬虫。首先需要列出所有可运行的爬虫,这会列出所有爬虫类中指定的name属性。

    scrapy list

    然后,我们可以按照name来运行爬虫。

    scrapy crawl 'csdn_blog' -o blog.json
    

    注意这两个命令都是项目相关的,只能用于已存在的项目。

    设置编码

    如果你使用上面的爬虫并导出为json格式,可能会发现所有汉字全变成了Unicode字符(类似\uA83B这样的)。自Scrapy1.2 起,增加了FEED_EXPORT_ENCODING属性,用于设置输出编码。我们在settings.py中添加下面的配置即可。

    FEED_EXPORT_ENCODING = 'utf-8'

    然后再重新导出一次。这次所有汉字都能正常输出了。

    爬虫结果

    以上就是Scrapy的快速入门了。我们了解了如何编写最简单的爬虫。如果查阅Scrapy的官方文档会发现Scrapy的功能远不止这里介绍的。本文就是起一个抛砖引玉的作用,如果希望进一步了解Scrapy这个爬虫框架,请查阅相关文档进一步学习。

    展开全文
  • scrapy爬虫框架入门实例

    万次阅读 多人点赞 2017-06-14 13:04:46
    scrapy爬虫框架入门实例关于如何安装scrapy框架,可以参考这篇文章 scrapy安装方法 初识scrapy框架,写个简单的例子帮助理解。强调一下,这里使用的是Python3.6例子的目标就是抓取慕课网的课程信息流程分析抓取...

    注意:经多人告知,慕课网的页面结构已经变了,所以说该案例实际上已经不能达到抓取目的。但是关于scrapy爬虫框架整体的使用方式和流程目前还是正确的,可以进行参考。

    scrapy爬虫框架入门实例

    关于如何安装scrapy框架,可以参考这篇文章
    scrapy安装方法
    初识scrapy框架,写个简单的例子帮助理解。

    强调一下,这里使用的是Python3.6

    Python

    例子的目标就是抓取慕课网的课程信息

    流程分析

    抓取内容

    例子要抓取这个网页http://www.imooc.com/course/list
    要抓取的内容是全部的课程名称,课程图片,课程人数,课程简介,课程URL
    这样的:
    这里写图片描述

    我们要抓取的是这一部分
    这里写图片描述
    或者说抓取其中的每一个课程div
    这里写图片描述

    #如果response是网页资源的话,下面的代码可以帮助我们获得div
    divs = response.xpath('//div[@class="moco-course-wrap"]/a[@target="_self"]')

    通过浏览器的调试工具我们可以看到它们的结构。
    这里写图片描述

    所以如果div已经获得的话通过如下获得信息

    #获取每个div中的课程路径
    item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]
    #获取div中的课程标题
    item['title'] = box.xpath('.//img/@alt').extract()[0].strip()
    #获取div中的标题图片地址
    item['image_url'] = box.xpath('.//@src').extract()[0]
    #获取div中的学生人数
    item['student'] = box.xpath('.//span/text()').extract()[0].strip()[:-3]
    #获取div中的课程简介
    item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()

    同时,为了抓取全部课程我们还要抓取跟进URL~
    这里就不在演示了。


    工作流程

    Scrapy框架抓取的基本流程是这样(随便画了一下,不要纠结)
    这里写图片描述
    当然了,还有一些中间件等等,这里是入门例子,所以不涉及。


    工程建立

    在控制台模式下进入你要建立工程的文件夹执行如下命令创建工程

    scrapy startproject scrapytest

    这里的scrapytest是工程名框架会自动在当前目录下创建一个同名的文件夹,工程文件就在里边。


    目录分析

    目录结构如下图。

    这里写图片描述

    scrapy.cfg: 项目的配置文件
    scrapytest/: 该项目的python模块。之后您将在此加入代码。
    scrapytest/items.py: 项目中的item文件.
    scrapytest/pipelines.py: 项目中的pipelines文件.
    scrapytest/settings.py: 项目的设置文件.
    scrapytest/spiders/: 放置spider代码的目录.
    

    创建一个爬虫

    下面按步骤讲解如何编写一个简单的爬虫。

    创建爬虫文件

    我们要编写爬虫,首先是创建一个Spider

    我们在scrapytest/spiders/目录下创建一个文件MySpider.py

    文件包含一个MySpider类,它必须继承scrapy.Spider类。

    同时它必须定义一下三个属性:

    -name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
    -start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
    -parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

    创建完成后MySpider.py的代码如下

    #引入文件
    import scrapy
    
    class MySpider(scrapy.Spider):
        #用于区别Spider
        name = "MySpider"
        #允许访问的域
        allowed_domains = []
        #爬取的地址
        start_urls = []
        #爬取方法
        def parse(self, response):
            pass

    定义爬取项目

    创建完了Spider文件,先不急着编写爬取代码
    我们先定义一个容器保存要爬取的数据。

    这样我们就用到了Item
    为了定义常用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。

    我们在工程目录下可以看到一个items文件,我们可以更改这个文件或者创建一个新的文件来定义我们的item。

    这里,我们在同一层创建一个新的item文件CourseItems.py

    CourseItems.py的代码如下

    #引入文件
    import scrapy
    
    class CourseItem(scrapy.Item):
        #课程标题
        title = scrapy.Field()
        #课程url
        url = scrapy.Field()
        #课程标题图片
        image_url = scrapy.Field()
        #课程描述
        introduction = scrapy.Field()
        #学习人数
        student = scrapy.Field()

    根据如上的代码,我们创建了一个名为courseItem的容器,用来保存、抓取的信息,
    title->课程标题, url->课程url, image_url->课程标题图片, introduction->课程描述, student->学习人数

    在创建完item文件后我们可以通过类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。

    常用方法如下

    #定义一个item
    course = CourseItem()
    #赋值
    course['title'] = "语文"
    #取值
    course['title']
    course.get('title')
    #获取全部键
    course.keys()
    #获取全部值
    course.items()

    编写Spider代码

    定义了item后我们就能进行爬取部分的工作了。

    为了简单清晰,我们先抓取一个页面中的信息。

    首先我们编写爬取代码

    我们在上文说过,爬取的部分在MySpider类的parse()方法中进行。
    parse()方法负责处理response并返回处理的数据以及(/或)跟进的URL。
    该方法及其他的Request回调函数必须返回一个包含 Request 及(或) Item 的可迭代的对象。

    我们在之前创建的MySpider.py中编写如下代码。
    注意和上边MySpider.py的区别

    import scrapy
    #引入容器
    from scrapytest.CourseItems import CourseItem
    
    class MySpider(scrapy.Spider):
        #设置name
        name = "MySpider"
        #设定域名
        allowed_domains = ["imooc.com"]
        #填写爬取地址
        start_urls = ["http://www.imooc.com/course/list"]
        #编写爬取方法
        def parse(self, response):
            #实例一个容器保存爬取的信息
            item = CourseItem()
            #这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
            #先获取每个课程的div
            for box in response.xpath('//div[@class="moco-course-wrap"]/a[@target="_self"]'):
                #获取每个div中的课程路径
                item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]
                #获取div中的课程标题
                item['title'] = box.xpath('.//img/@alt').extract()[0].strip()
                #获取div中的标题图片地址
                item['image_url'] = box.xpath('.//@src').extract()[0]
                #获取div中的学生人数
                item['student'] = box.xpath('.//span/text()').extract()[0].strip()[:-3]
                #获取div中的课程简介
                item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()
                #返回信息
                yield item

    注:这里用到了xpath方式来获取页面信息,这里不做过多介绍,可以参考网上的xpath教程来自己学习。

    在parse()方法中response参数返回一个下载好的网页信息,我们然后通过xpath来寻找我们需要的信息。
    在scrapy框架中,可以使用多种选择器来寻找信息,这里使用的是xpath,同时我们也可以使用BeautifulSoup,lxml等扩展来选择,而且框架本身还提供了一套自己的机制来帮助用户获取信息,就是Selectors。
    因为本文只是为了入门所以不做过多解释。

    在执行完以上步骤之后,我们可以运行一下爬虫,看看是否出错。

    在命令行下进入工程文件夹,然后运行

    scrapy crawl MySpider

    如果操作正确会显示如下信息。

    这里写图片描述

    上面信息表示,我们已经获取了信息,接下来我们开始进行信息的储存。


    使用Pipeline处理数据

    当我们成功获取信息后,要进行信息的验证、储存等工作,这里以储存为例。
    当Item在Spider中被收集之后,它将会被传递到Pipeline,一些组件会按照一定的顺序执行对Item的处理。
    Pipeline经常进行一下一些操作:
    清理HTML数据
    验证爬取的数据(检查item包含某些字段)
    查重(并丢弃)
    将爬取结果保存到数据库中

    这里只进行简单的将数据储存在json文件的操作。

    首先在scrapytest/目录下建立一个文件MyPipelines.py

    MyPipelines.py代码如下

    #引入文件
    from scrapy.exceptions import DropItem
    import json
    
    class MyPipeline(object):
        def __init__(self):
            #打开文件
            self.file = open('data.json', 'w', encoding='utf-8')
        #该方法用于处理数据
        def process_item(self, item, spider):
            #读取item中的数据
            line = json.dumps(dict(item), ensure_ascii=False) + "\n"
            #写入文件
            self.file.write(line)
            #返回item
            return item
        #该方法在spider被开启时被调用。
        def open_spider(self, spider):
            pass
        #该方法在spider被关闭时被调用。
        def close_spider(self, spider):
            pass

    要使用Pipeline,首先要注册Pipeline

    找到settings.py文件,这个文件时爬虫的配置文件

    在其中添加

    ITEM_PIPELINES = {
        'scrapytest.MyPipelines.MyPipeline': 1,
    }

    上面的代码用于注册Pipeline,其中scrapytest.MyPipelines.MyPipeline为你要注册的类,右侧的’1’为该Pipeline的优先级,范围1~1000,越小越先执行。

    进行完以上操作,我们的一个最基本的爬取操作就完成了

    这时我们再运行

    scrapy crawl MySpider

    就可以在项目根目录下发现data.json文件,里面存储着爬取的课程信息。

    如下图:
    这里写图片描述

    这样一个简单的爬虫就完成了。


    扩展完善

    上面的代码只进行了比较简单的爬取,并没有完成爬取慕课网全部课程的目标。
    下面进行一些简单的扩展完成我们的目标。

    url跟进

    在上面我们介绍了如何进行简单的单页面爬取,但是我们可以发现慕课网的课程是分布在去多个页面的,所以为了完整的爬取信息课程信息,我们需要进行url跟进。

    为了完成这个目标需要对MySpider.py文件进行如下更改

    import scrapy
    #引入容器
    from scrapytest.CourseItems import CourseItem
    
    class MySpider(scrapy.Spider):
        #设置name
        name = "MySpider"
        #设定域名
        allowed_domains = ["imooc.com"]
        #填写爬取地址
        start_urls = ["http://www.imooc.com/course/list"]
        #编写爬取方法
        def parse(self, response):
            #实例一个容器保存爬取的信息
            item = CourseItem()
            #这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
            #先获取每个课程的div
            for box in response.xpath('//div[@class="moco-course-wrap"]/a[@target="_self"]'):
                #获取每个div中的课程路径
                item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]
                #获取div中的课程标题
                item['title'] = box.xpath('.//img/@alt').extract()[0].strip()
                #获取div中的标题图片地址
                item['image_url'] = box.xpath('.//@src').extract()[0]
                #获取div中的学生人数
                item['student'] = box.xpath('.//span/text()').extract()[0].strip()[:-3]
                #获取div中的课程简介
                item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()
                #返回信息
                yield item
            #url跟进开始
            #获取下一页的url信息
            url = response.xpath("//a[contains(text(),'下一页')]/@href").extract()
            if url :
                #将信息组合成下一页的url
                page = 'http://www.imooc.com' + url[0]
                #返回url
                yield scrapy.Request(page, callback=self.parse)
            #url跟进结束

    修改成功后就可以自动进行url跟进了。


    下载图片

    在上文我们爬取了慕课网全部的课程信息,但是每个课程的标题图片我们只获得了url并没有下载下了,这里我们进行图片下载的编写。

    首先我们在CourseItems.py文件中添加如下属性

    #图片地址
    image_path = scrapy.Field()

    因为我们要下载图片,所以需要用这个属性用来保存下载地址。

    接下来我们需要创建一个Pipeline用来下载图片。

    这里我们创建一个ImgPipelines.py

    代码如下:

    import scrapy
    from scrapy.contrib.pipeline.images import ImagesPipeline
    from scrapy.exceptions import DropItem
    
    class ImgPipeline(ImagesPipeline):
        #通过抓取的图片url获取一个Request用于下载
        def get_media_requests(self, item, info):
            #返回Request根据图片图片url下载
            yield scrapy.Request(item['image_url'])
        #当下载请求完成后执行该方法
        def item_completed(self, results, item, info):
            #获取下载地址
            image_path = [x['path'] for ok, x in results if ok]
            #判断是否成功
            if not image_path:
                raise DropItem("Item contains no images")
            #将地址存入item
            item['image_path'] = image_path
            return item

    这里我们使用的是Scrapy提供的ImagesPipeline,这个pipeline专门进行图片的下载,
    这里、主要用到两个方法:get_media_requests() 和item_completed()

    get_media_requests(item, info)方法是通过抓取的图片url来返回一个Request,这个Request将对图片进行下载。
    在下载请求完成后(下载成功或失败)就会调用item_completed()方法。

    item_completed(results, items, info)
    方法在下载请求完成后执行.
    参数results包含三个项目

    url->图片的url,
    path->下载后保存地址,
    checksum->图片内容的 MD5 hash
    

    该方法需要返回item供后续操作。

    编写完ImgPipelines后照例需要注册一下

    ITEM_PIPELINES = {
        'scrapytest.MyPipelines.MyPipeline': 100,
        'scrapytest.ImgPipelines.ImgPipeline': 1,
    }

    注意这里的顺序,因为我要先下载图片再获得图片的路径,所以应该先处理ImgPipeline再处理MyPipeline,所以说ImgPipeline的数字小一些。

    同时,因为是下载图片这里需要注册一下保存地址,还是在settings.py文件

    IMAGES_STORE = 'D:\\img\\'

    IMAGES_STORE规定了保存地址,地址自己随意。

    这样在运行爬虫就会下载图片了,就像这样
    这里写图片描述

    同时注意了,因为要进行下载任务,所以说电脑不好的同学很有可能内存溢出,所以不推荐在pipeline中执行下载等任务,可以在后期处理。如果非要处理的话可以更改CONCURRENT_ITEMS参数减少并发处理item的数量来降低系统开销。

    CONCURRENT_ITEMS属性默认为100,就是同时处理100个item可以适当降低,实在不行就是1


    总结

    把多余的文件删除后的目录结构
    这里写图片描述

    上面的处理结束后我们就成功的抓取了慕课网的全部课程信息了。
    这里写图片描述
    以上就是我的Scrapy入门小例子了。如果有看到的希望指出不足。

    附上我的代码:scrapy抓取实例

    展开全文
  • Scrapy爬虫框架,入门案例(非常详细)

    千次阅读 多人点赞 2020-04-12 11:43:45
    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试. 其最初是为了页面抓取 (更确切来说, 网络抓取 ...

     

    目录

    一、概述

    二、Scrapy五大基本构成:

    三、整体架构图

    四、Scrapy安装以及生成项目

    五、日志等级与日志保存

    六、导出为json或scv格式

    七、一个完整的案例


    一、概述

    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.

    其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 后台也应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.

    Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持.

    二、Scrapy五大基本构成:

    Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。下面我们分别介绍各个组件的作用。

    (1)、调度器(Scheduler):

    调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。

    (2)、下载器(Downloader):

    下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。

    (3)、 爬虫(Spider):

    爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。

    (4)、 实体管道(Item Pipeline):

    实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。

    (5)、Scrapy引擎(Scrapy Engine):

    Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。

     

    三、整体架构图

    本图按顺序说明整个程序执行时候发生的顺序。

    注意在调用下载器时,往往有一个下载器中间件,使下载速度提速。

    官网架构图 

     

    四、Scrapy安装以及生成项目

     

    新建一个项目,该项目的结构如下:

     

    执行命令,widows和ubuntu命令格式是一样的:

    下载方式

    ubuntu,打开一个终端,输入pip install scrapy(或pip3  install scrapy)

    widows ,打开一个cmd,输入pip install scrapy,前提是你装了pip

    详细安装请点这

     

    scrapy startproject 项目名

    scrapy genspider 爬虫名 域名

    scrapy crawl 爬虫名

    我使用的是widows版本,下面演示创建项目的例子

    打开cmd,输入(默认是在C:\Users\Administrator>这个目录下,你可以自行切换)

    scrapy startproject myfirstPj

    cd my firstPj

    scrapy genspider baidu www.baidu.com

    创建后目录大致页如下

    |-ProjectName              #项目文件夹

       |-ProjectName           #项目目录

          |-items.py               #定义数据结构

          |-middlewares.py    #中间件

          |-pipelines.py          #数据处理

          |-settings.py            #全局配置

          |-spiders               

              |-__init__.py       #爬虫文件

              |-baidu.py

       |-scrapy.cfg               #项目基本配置文件

     

    spiders下的baidu.py是scrapy自动为我们生成的

     

    下面再看一下spdier项目的配置文件,打开文件settings.py 

    BOT_NAME:项目名

    USER_AGENT:默认是注释的,这个东西非常重要,如果不写很容易被判断为电脑,简单点洗一个Mozilla/5.0即可

    ROBOTSTXT_OBEY:是否遵循机器人协议,默认是true,需要改为false,否则很多东西爬不了

     

     CONCURRENT_REQUESTS:最大并发数,很好理解,就是同时允许开启多少个爬虫线程

    DOWNLOAD_DELAY:下载延迟时间,单位是秒,控制爬虫爬取的频率,根据你的项目调整,不要太快也不要太慢,默认是3秒,即爬一个停3秒,设置为1秒性价比较高,如果要爬取的文件较多,写零点几秒也行

    COOKIES_ENABLED:是否保存COOKIES,默认关闭,开机可以记录爬取过程中的COKIE,非常好用的一个参数

    DEFAULT_REQUEST_HEADERS:默认请求头,上面写了一个USER_AGENT,其实这个东西就是放在请求头里面的,这个东西可以根据你爬取的内容做相应设置。

     

    ITEM_PIPELINES:项目管道,300为优先级,越低越爬取的优先度越高

     比如我的pipelines.py里面写了两个管道,一个爬取网页的管道,一个存数据库的管道,我调整了他们的优先级,如果有爬虫数据,优先执行存库操作。

    ITEM_PIPELINES = {
        'scrapyP1.pipelines.BaiduPipeline': 300,
        'scrapyP1.pipelines.BaiduMysqlPipeline': 200,
    }

     

     到这里我们尝试用scrapy做一下爬取,打开spider.py下的baidu.py(取决于你scrapy genspider 爬虫名 域名时输入的爬虫名)

    输入一下代码,我们使用xpath提取百度首页的标题title

    import scrapy
    
    
    class BaiduSpider(scrapy.Spider):
        name = 'baidu'
        allowed_domains = ['www.baidu.com']
        start_urls = ['http://www.baidu.com/']
    
        def parse(self, response):
            tile=response.xpath('//html/head/title/text()')
            print(tile)

     

    打开一个终端cmd,输入scrapy crawl baidu(爬虫名),就可以看到一大堆输出信息,而其中就包括我们要的内容

     

    使用终端运行太麻烦了,而且不能提取数据,我们一个写一个run文件作为程序的入口,splite是必须写的,目的是把字符串转为列表形式,第一个参数是scrapy,第二个crawl,第三个baidu

    from scrapy import cmdline
    
    cmdline.execute('scrapy crawl baidu'.split())

    可以在编辑器中输出了 

     

    五、日志等级与日志保存

    在setting.py里面可以设置日志的等级与日志存放的路径

    相关变量

    LOG_LEVEL= ""

    LOG_FILE="日志名.log"

    日志等级分为

    1.DEBUG 调试信息

    2.INFO 一般信息

    3.WARNING 警告

    4.ERROR 普通错误

    5.CRITICAL 严重错误

    如果设置

    LOG_LEVEL="WARNING",就只会WARNING等级之下的ERROR和CRITICAL

    默认等级是1

     

    六、导出为json或scv格式

    执行爬虫文件时添加-o选项即可

    scrapy crawl 项目名 -o *.csv

    scrapy crawl 项目名 -o *.json

    对于json文件,在setting.js文件里添加,设置编码格式,否则会乱码:

    FEED_EXPORT_ENCODING='utf-8'

    示例:

    from scrapy import cmdline
    
    cmdline.execute('scrapy crawl baidu -o baidu.csv'.split())

     

    七、一个完整的案例

    这个项目我们的主题是爬腾讯视频的电影信息,包括电影名和描述

     

    1.创建项目

    打开一个终端输入(建议放到合适的路径下,默认是C盘)

    scrapy startproject TXmovies

    cd TXmovies

    scrapy genspider txms v.qq.com

    2.修改setting

    修改三项内容,第一个是不遵循机器人协议,第二个是下载间隙,由于下面的程序要下载多个页面,所以需要给一个间隙(不给也可以,只是很容易被侦测到),第三个是请求头,添加一个User-Agent,第四个是打开一个管道

    ROBOTSTXT_OBEY = False
    
    DOWNLOAD_DELAY = 1
    
    DEFAULT_REQUEST_HEADERS = {
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Language': 'en',
      'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
    }
    
    ITEM_PIPELINES = {
       'TXmovies.pipelines.TxmoviesPipeline': 300,
    }

     

    3.确认要提取的数据,item项

    item定义你要提取的内容(定义数据结构),比如我提取的内容为电影名和电影描述,我就创建两个变量。Field方法实际上的做法是创建一个字典,给字典添加一个建,暂时不赋值,等待提取数据后再赋值。下面item的结构可以表示为:{'name':'','descripition':''}。

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class TxmoviesItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        name = scrapy.Field()
        description = scrapy.Field()
    

    4.写爬虫程序

    我们要写的部分是parse方法里的内容,重点在于如何写xpath,关于xpath我不多讲,有兴趣可以看看我另一篇文章,XPATH教程

    引入刚刚写好的item,刚刚说了item里面创建的变量就是字典的键值,可以直接进行赋值。赋值后交给管道处理。

    简单讲一下这一段代码的思路,首先腾讯视频的url为https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset=0&pagesize=30

    我们注意到offset这一项,第一页的offset为0,第二页为30,依次推列。在程序中这一项用于控制抓取第一页,但是也要给一个范围,不可能无限大,否则会报错,可以去看看腾讯一共有多少页视频,也可以写一个异常捕获机制,捕捉到请求出错则退出。我这里仅仅是示范,所以只给了120,也就是4页。

     

    yield

    程序里一共有两个yield,我比较喜欢叫它中断,当然中断只在CPU中发生,它的作用是移交控制权,在本程序中,我们对item封装数据后,就调用yield把控制权给管道,管道拿到处理后return返回,又回到该程序。这是对第一个yield的解释。

    第二个yield稍微复杂点,这条程序里利用了一个回调机制,即callback,回调的对象是parse,也就是当前方法,通过不断的回调,程序将陷入循环,如果不给程序加条件,就会陷入死循环,如本程序我把if去掉,那就是死循环了。

    yield scrapy.Request(url=url,callback=self.parse)

     

    xpath

    还有一个要注意的是如何提取xpathl里的数据,我们的写法有四种,第一种写法拿到selector选择器,也就是原数据,里面有一些我们用不到的东西。第二个extract(),将选择器序列号为字符串。第三个和第四个一样,拿到字符串里的第一个数据,也就是我们要的数据。

    items['name']=i.xpath('./a/@title')[0]

    items['name']=i.xpath('./a/@title').extract()

    items['name']=i.xpath('./a/@title').extract_first()

    items['name']=i.xpath('./a/@title').get()

    # -*- coding: utf-8 -*-
    import scrapy
    from ..items import TxmoviesItem
    
    class TxmsSpider(scrapy.Spider):
        name = 'txms'
        allowed_domains = ['v.qq.com']
        start_urls = ['https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset=0&pagesize=30']
        offset=0
    
        def parse(self, response):
            items=TxmoviesItem()
            lists=response.xpath('//div[@class="list_item"]')
            for i in lists:
                items['name']=i.xpath('./a/@title').get()
                items['description']=i.xpath('./div/div/@title').get()
    
                yield items
    
            if self.offset < 120:
                self.offset += 30
                url = 'https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset={}&pagesize=30'.format(
                    str(self.offset))
    
                yield scrapy.Request(url=url,callback=self.parse)
    

    5.交给管道输出

    管道可以处理提取的数据,如存数据库。我们这里仅输出。

    # -*- coding: utf-8 -*-
    
    # 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
    
    
    class TxmoviesPipeline(object):
        def process_item(self, item, spider):
            print(item)
            return item
    

    6.run,执行项目

    from scrapy import cmdline
    
    cmdline.execute('scrapy crawl txms'.split())

    7.测试结果

    白色的管道输出的结果,红色的调试信息

     

    8.流程梳理

    新建项目-》进入项目-》新建爬虫文件-》明确抓取的内容,写item-》写爬虫程序,爬取数据-》交给管道处理数据-》调整全局配置setting-》执行爬虫程序,可以通过终端或者在程序里写一个run程序

     

    9.提速:多线程爬取

    如果你实现了上面的实验,不难发现其爬取速度是非常慢,根本的原因就是因为它是顺序执行的,你可以从结果中看出,总是前面一页的内容被输出,再输出后面的内容。不适合处理数据量较大的情况,一个好的方式是采用多线程的方法,这里的多线程是基于方法的多线程,并不是通过创建Thread对象来实现,是在一个方法中,一次性把请求交给调度器。

    我们通过重写start_requests方法来实现我们的想法(这个方法的源码在__init__.py下面,有兴趣可以看一下)

    # -*- coding: utf-8 -*-
    import scrapy
    from ..items import TxmoviesItem
    
    class TxmsSpider(scrapy.Spider):
        name = 'txms'
        allowed_domains = ['v.qq.com']
        url='https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset={}&pagesize=30'
        offset=0
    
        def start_requests(self):
            for i in range(0,121,30):
                url=self.url.format(i)
                yield scrapy.Request(
                    url=url,
                    callback=self.parse
                )
    
        def parse(self, response):
            items=TxmoviesItem()
            lists=response.xpath('//div[@class="list_item"]')
            for i in lists:
                items['name']=i.xpath('./a/@title').get()
                items['description']=i.xpath('./div/div/@title').get()
    
                yield items
    

     

    展开全文
  • scrapy

    千次阅读 2019-09-02 14:28:08
    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试. Scrapy主要包括了以下组件: 引擎(Scrapy) ...
  • Scrapy框架流程图解析

    万次阅读 多人点赞 2018-09-04 18:31:45
    接下来就放一张scrapy的流程图喽~ 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler...
  • Scrapy工作原理

    千次阅读 2019-01-31 14:02:35
    一、Scrapy架构图 Scrapy框架主要由六大组件组成,它们分别是调试器(Scheduler)、下载器(Downloader)、爬虫(Spider)、中间件(Middleware)、实体管道(Item Pipeline)和Scrapy引擎(Scrapy Engine) 1、Scrapy ...
  • Scrapy(官网 http://scrapy.org/)是一款功能强大的,用户可...Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their page...
  • Scrapy

    千次阅读 多人点赞 2018-08-16 22:21:24
    Scrapy介绍  Scrapy一个开源和协作的框架,其最初是为了页面抓取(更确切来说,网络抓取)所设计的,使用它可以快速、简单、可扩展 的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如挖掘、...
  • scrapy内置中间件的顺序

    万次阅读 2020-07-20 21:54:18
    scrapy的内置中间件顺序以及默认settings配置
  • Scrapy-Redis入门实战

    万次阅读 2019-12-19 16:56:11
    目录 ...scrapy-redis是一个基于redis的scrapy组件,用于快速实现scrapy项目的分布式部署和数据爬取,其运行原理如下图所示。 Scrapy-Redis特性 分布式爬取 你可以启动多个共享同一redis队列...
  • 小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验 标签: Python 1.官方文档与简介 官方文档:https://docs.scrapy.org/en/latest/ 简介: Scrapy,谐音西瓜皮,Python开发的一个快速、高层次的屏幕...
  • Python3 Scrapy爬虫框架(Scrapy/scrapy-redis)

    千次阅读 2018-04-19 23:34:16
    Python3 Scrapy爬虫框架(Scrapy/scrapy-redis) 本文由 Luzhuo 编写,转发请保留该信息. 原文: https://blog.csdn.net/Rozol/article/details/80010173 Scrapy Scrapy 是 Python 写的, 主要用于爬取网站...
  • 基于Scrapy的IP代理池搭建

    万次阅读 2019-12-19 17:00:51
    目录 一、为什么要搭建爬虫代理池 二、搭建思路 三、搭建代理池 items.py kuai_proxy.py ...在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时,...
  • 用Pyinstaller打包Scrapy项目问题解决!!!

    万次阅读 热门讨论 2019-10-15 18:55:54
    这篇报废,这里的PyInstaller教程相信对大家会有用,其中会解决spider not found的问题,真正成功地打包Scrapy:https://blog.csdn.net/La_vie_est_belle/article/details/96321995 这个是我的项目目录: ...
  • 目录 下载器中间件简介 自定义下载器中间件 RandomUserAgentMiddleware RandomProxyMiddleware 激活下载器中间件 内置下载器中间件 CookiesMiddleware DefaultHeadersMiddleware ...RedirectMidd...
  • Scrapy-Redis源码解读

    万次阅读 2019-12-19 16:57:53
    在上一章《Scrapy-Redis入门实战》中,我们在一个普通的Scrapy项目的settings.py文件中仅额外增加了如下几个配置就使项目实现了基于Redis的Requests请求过滤和Items持久化两大功能。 ############################...
  • Scrapy框架的使用之Scrapy对接Selenium

    万次阅读 多人点赞 2018-12-12 19:25:00
    一种是分析Ajax请求,找到其对应的接口抓取,Scrapy同样可以用此种方式抓取。另一种是直接用Selenium或Splash模拟浏览器进行抓取,我们不需要关心页面后台发生的请求,也不需要分析渲染过程,只需要关心页面...
  • Scrapy 配置动态代理IP

    万次阅读 2019-06-03 21:23:30
    Scrapy 配置动态代理IP 应用 Scrapy框架 ,配置动态IP处理反爬。 # settings 配置中间件 DOWNLOADER_MIDDLEWARES = { 'text.middlewares.TextDownloaderMiddleware': 543, # 'text.middlewares....
1 2 3 4 5 ... 20
收藏数 64,478
精华内容 25,791
关键字:

scrapy