用Python刮方法!初学者评论

如今,随着机器学习的普及,需要用于从网站收集数据的抓取技术。

但是,在进行刮刮时,有些人可能会遇到麻烦,因为很难理解“应该使用哪个框架进行开发”和“刮刮注意事项”等部分。

因此,这一次,我将为初学者介绍使用Python的抓取方法和应用方法。

对于那些担心学习Python编程的人

我开始学习Python是因为我想学习AI和数据科学
“您自己可以学到的东西是有限的。”
我想推荐给那些感到不安的人爱德美高级计划
有关AI的各种课程彻底的指导指导是功能!

对于那些想学习Python以便实践的人来说,首先自由”在线咨询参与在请试试。

也,爱德美高级计划的优缺点有关更多信息,请参考以下文章。
爱德米的声誉和口碑总结!介绍为什么要服用它

使用Python抓取之前:先验知识

首先,在使用Python实现抓取之前,让我们先谈谈“抓取”是什么。

如果有人说:“我知道!”请跳到。

什么是刮ing?

爬取是指从网页的HTML获取所需的信息。

近年来,由于机器学习需要大量数据,因此手动操作效率低下,因此用于以Python等编写程序以实现自动化的技术变得非常重要。

例如,如果要通过抓取收集赛马信息,请搜索一个网页,其中存储了赛马结果和赛马信息等信息,并使用程序自动在该页面上收集信息。这将是一个程序。

爬网访问特定的URL,即从http请求返回的HTML中提取信息。因此,如上图所示,HTML最终将返回给您。

刮刮时的注意事项

进行刮擦时要记住一些注意事项。

关键是为了追求收集速度而进行的抓取可能会在要收集其的网页的服务器上写入可怕的负载。

在最坏的情况下,可能会因为业务中断而起诉此类行为。

此外,有许多站点禁止由于服务器负载和侵犯版权而进行抓取。

网站的使用条款中描述了禁止刮擦的网站。

进行抓取时,请首先确保目标站点不禁止抓取,然后再考虑该网站的服务器。

一般刮法

典型的抓取由多个元素组成,例如发出HTTP请求和从HTML提取信息。

因此,在抓取时,有必要正确使用多个库并根据目标页面进行制作。

通常,以下库组合是著名的。

要求 获取网页HTML信息的库
美丽的汤 提取HTML信息的库
一个库,用于对需要在浏览器上进行操作(例如登录)的页面进行数据获取

仅适当地使用它们是很复杂的,但是根据条件,如果涉及到诸如“在页面中巡逻”和“在DB中存储数据”之类的元素,不仅实现而且设计也变得重要,因此开发它就可以了。我会花很多时间。

此方法不适合初学者。

使用Python的刮取方法

在这里,我将解释使用Python和实际代码进行抓取。

如果您没有Pipenv环境,请参考此处进行安装。

[对于初学者]从Python安装到环境构建的简单易懂的解释!

适用于初学者抓取的Python框架:Scrapy

因此,这次引入的Python框架是Scrapy。

Scrapy是一个抓取框架,可让您轻松设置前面所述的数据获取和提取。

此外,通过基于Scrapy的基本结构进行自定义,您可以创建刮取工具而无需担心设计。

//cdn-ak.f.st-hatena.com/images/fotolife/t/todays_mitsui/20160924/20160924231058.png

刮板结构图

安装

首先,让我们安装Scrapy。

 pip 安装安装 scrapy 
 conda 安装安装 scrapy 

项目创建

Scrapy能够生成从命令启动它所需的功能。

 scrapy startproject <プロジェクト名> 

这将生成以下结构:

测试Project/
├── scrapy.cfg
└── 测试Project
    ├── __init__.py
    ├── items.py // 刮ingする対象の変数を作成する
    ├── middlewares.py //
    ├── pipelines.py //
    ├── __pycache__
    ├── settings.py // 爬行やダウンロードの設定を行う
    └── spiders // ここに自分のスクレイピングのスクリプトを作成する
        ├── __init__.py
        └── __pycache__

使用Scrapy进行Python抓取的实现示例

现在,这是一个实现示例。

我们将实施“抓取和抓取具有特定域的网站”。

这次,我要抓取Yahoo新闻的信息。
//news.yahoo.co.jp/

确定要获取的信息

首先,确定要获取的信息。

打开testProject / item.py并在此处实现。

在Scrapy中,从名为Field的类中创建一个变量,然后创建一个变量来存储收集的信息。

import scrapy

class TestprojectItem(scrapy.Item):
    # define the fields for your item here like:の
    name = scrapy.Field()
    pass

爬行

我们将实施巡逻(爬行)。

您需要的是

  1. 爬行起点
  2. 确定爬网规则
  3. 爬行目标

有三种。

由于这一次我们的结构很简单,因此我们将做一些只能在爬网的起点实现的操作。

# -*- coding: utf-8 -*-
import scrapy
from 测试Project.items import TestprojectItem

class TestSpider(scrapy.Spider):
    name = "test_spider"
    start_urls = [
        "//news.yahoo.co.jp/" // これがクローリングのスタート地点のURL
    ]

    def parse(self, response):
        """
        ページの巡回経路を記述する関数。
        :return: None
        """
        news_list = response.xpath("//body//ul[@class='toptopics_list']//li")
        self.logger.critical(news_list)
        for news in news_list:
            self.logger.critical(news.xpath("a/@href").extract())
			# ニュースのリンクから情報からもう一度リクエストを投げる
            yield scrapy.Request(url=news.xpath("a/@href").extract()[0],callback=self.parse_page)

刮ing

接下来是信息获取(抓取)。

如上图所示,从发出请求后返回的HTML获取信息。

对于Scrapy,您可以使用CSS选择器和xpath。

这次,让我们使用鲜为人知的xpath来实现它。

  • 元素规格
  • `// h1`

  • 元素文字
  • `// p /文字()`

  • 指定属性,例如类名
  • `//一个[@ id =”test”]`

  • 仅指定特定的同级元素
  • // li [1] /文本()

如果可以这样做,大多数数据提取就可以了。

请参阅下面的其他符号。

实施实例

在/ TestProject / spiders /下创建一个名为testSpider.py的文件,并编写以下代码。

# -*- coding: utf-8 -*-
import scrapy
from 测试Project.items import TestprojectItem

class TestSpider(scrapy.Spider):
    name = "test_spider" # 蜘蛛的名字(scrapyを実行する際に必要なスクリプトの名前のようなもの)
    start_urls = [
        "//news.yahoo.co.jp/" # どの地点からクローリングを始めるかの指定
    ]

    def parse(self, response):
        """
        ページの巡回経路を記述する関数。
        :return: None
        """
        news_list = response.xpath("//body//ul[@class='toptopics_list']//li") 
        for news in news_list:
            self.logger.critical(news.xpath("a/@href").extract())
            yield scrapy.Request(url=news.xpath("a/@href").extract()[0],callback=self.parse_page)

    def parse_page(self, response):
        item = TestprojectItem()
        item["title"] = response.xpath("//h2[@class='tpcNews_title']/text()").extract()
        item["summary"] = response.xpath("//p[@class='tpcNews_summary']/text()").extract()
        yield item

这部分有点令人困惑,因此我将对其进行详细说明。

流程为以下循环。

*从新闻列表中提取HTML信息
*从新闻列表部分获取标签链接目标的URL信息
*根据获取的URL再次发出请求,并指定如何使用回调提取请求
*获取信息,将其存储在项目中并作为返回值返回

当Scrapy执行抓取时,它会向指定的URL发出请求,并将结果作为响应返回。
这存储在第11行的parse函数的第二个参数中。 (以下称为响应对象)

在此响应对象中,指定URL(即HTML)的响应存储为称为主体的变量,
另一方面,实现提取功能。

这次,它使用xpath提取,但它对应于第16行。

这次,我跳出了新闻列表部分的链接,获得了除此以外的信息。

在第16至19行获取新闻的列表部分,并从那里获取标签链接目标的URL信息。
第19行根据获取的URL再次引发请求。

如何提取请求值的功能是第21行的parse_page。

运行它

执行命令在其自身实现的脚本层次结构中实现以下命令。
这次,让我们用csv吐出它,以便于检查。

刮y的<スパイダーの名前> -o <ファイル名> -t <ファイルフォーマット>

在这种情况下,它看起来像↓。

cd 测试Project /蜘蛛
拼凑的runpider 测试_spider -o 测试.csv -t csv

有了这个,
测试Project /蜘蛛
如果生成csv,则表示成功。

调试

您现在可以运行了。
但是,每次查看HTML的结构,用python编写源代码并验证结果都非常麻烦。

特别是,我想检查我想获取的信息是否可以提取,以及xpath是否存在问题。

因此,让我们使用scrapy的shell进行验证。

启动外壳

scrapy shell

指定URL

fetch (<URL>)

尝试用xpath指定

resposen.xpath(<xpath>).extract()

现在让我们显示结果。

设置

Scrapy从setting.py设置各种数据。
例如,爬网的速度以及获取后是否忽略页面。

在大多数情况下

 <パラメーター名>: パラメータ

它变成了。
这次,让我们开始等待每个请求几秒钟的过程。

在setting.py中

DOWNLOAD_DELAY: 2

让我们添加一行。
现在,您必须从一页下载数据后等待2秒钟。

其他参数的设置请参考下一页。
//docs.scrapy.org/en/latest/topics/settings.html

如果您要抓取的页面需要SPA或登录

到目前为止,您可以进行基本的抓取,但这还不够。

这是因为仅Scrapy无法为配置为使用javascrupt(SPA)异步加载页面的页面或只能通过登录才能看到的页面提供完整的信息。

因此,通过引入我在座位上介绍的名为selenium的库,您可以直接从源代码中以表格的形式输入值并登录或按下加载按钮,因此让我们结合使用它。 ..

硒是使您可以从源代码操作浏览器的工具。
官方网站

  • 安装安装
  •  pip 安装安装 硒 
     conda 安装安装 硒 
  • 建立
  • 该工具允许您编写代码并操作浏览器,因此您可以在登录表单中输入信息以登录。

    1. 获取元素
    2.         driver.find_element_by_id("id_name") # HTMLのID名でデータを取得する
              driver.find_element_by_class("class_name") # HTMLのID名でデータを取得する
          

      了解更多信息
      看这里

    3. 表格填写
    4.         form = driver.find_element_by_tag("form")
              form.sendKey("inout text")
          
    5. 发送
    6.         form = driver.find_element_by_tag("form")
              form.sendKey("inout text")
              form.submit()
          

    登录流程示例

        form = driver.find_element_by_tag("form")
        email = driver.find_element_by_id("email") # email入力フォームの情報を取得
        email.sendKey("inout text")
        pass = driver.find_element_by_id("password") # password入力フォームの情報を取得
        pass.sendKey("inout text")
        form.submit() # 发送
    

    与Scrapy合作

    现在,让我们链接Scrapy和Selenium。

    Scrapy具有称为中间件的功能,该功能可让您在特定进程的时间(例如,在对URL进行请求之前发生错误)时插入另一个进程。

    为了清楚起见,这一次,我们将在一个文件中对其进行描述。

    # -*- coding: utf-8 -*-
    import scrapy
    from 测试Project.items import TestprojectItem
    from 硒 import webdriver
    from 硒.webdriver.common.keys import Keys
    from 硒.webdriver.chrome.options import Options
    
    class TestSpider(scrapy.Spider):
        name = "test_spider"
        start_urls = [
            "//news.yahoo.co.jp/"
        ]
        def parse(self, response):
            """
            ページの巡回経路を記述する関数。
            :return: None
            """
            options = Options()
            options.add_argument("--headless") # ヘッドレスモードのオプションを追加
            driver = webdriver.Chrome(options=options)
            self.driver.get(url="//news.yahoo.co.jp/") # URL を指定
    
            # ここでログインやクリックなどの処理を挟む
    
            response.replace(body=driver.page_source) #レスポンスオブジェクトのHTMLをseleniumのものと差し替える
            news_list = response.xpath("//body//ul[@class='toptopics_list']//li")
            for news in news_list:
                self.logger.critical(news.xpath("a/@href").extract())
                yield scrapy.Request(url=news.xpath("a/@href").extract()[0],callback=self.parse_page)
    
        def parse_page(self, response):
            item = TestprojectItem()
            item["title"] = response.xpath("//h2[@class='tpcNews_title']/text()").extract()
            item["summary"] = response.xpath("//p[@class='tpcNews_summary']/text()").extract()
            yield item
    

    配置是selenium负责请求和巡检页面,而scrapy负责提取数据。

    以此方式,将诸如点击和记录的复杂处理留给硒,并且获取点击和记录之后的HTML,并且获取那些HTML。

    然后,获取HTML,将其传递给Scrapy,并使用Scrapy函数提取数据。

    简介:使用Python进行爬取!

    爬取不仅是机器学习所必需的技能,而且对于那些想要自己建立特定信息数据库的人也是如此。

    需要牢记一些事情,但要牢记这些并过着高效的数据收集生活。

    撰写本文的人

    assa

    我是京都的工程师。记住assa或eh。 我的主要业务是在网上玩我的业余爱好。有什么好的