Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonとScrapyを使用したWebスクレイピング?


クローラーを開発するための最良のフレームワークの1つは、scrapyです。 Scrapyは、高レベルの機能を利用してWebサイトのスクレイピングを容易にする、人気のあるWebスクレイピングおよびクロールフレームワークです。

インストール

Windowsにscrapyをインストールするのは簡単です。pipまたはconda(anacondaがある場合)のいずれかを使用できます。 ScrapyはPython2と3の両方のバージョンで動作します。

pip install Scrapy

または

conda install –c conda-forge scrapy

Scrapyが正しくインストールされている場合、scrapyコマンドがターミナルで使用できるようになります-

C:\Users\rajesh>scrapy
Scrapy 1.6.0 - no active project

Usage:
scrapy <command> [options] [args]

Available commands:
bench    Run quick benchmark test
fetch    Fetch a URL using the Scrapy downloader
genspider   Generate new spider using pre-defined templates
runspider  Run a self-contained spider (without creating a project)
settings   Get settings values
shell   Interactive scraping console
startproject    Create new project
version    Print Scrapy version
view    Open URL in browser, as seen by Scrapy

[ more ] More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command.

プロジェクトの開始

Scrapyがインストールされたので、 startprojectを実行できます。 最初のScrapyプロジェクトのデフォルト構造を生成するコマンド。

これを行うには、ターミナルを開き、Scrapyプロジェクトを保存するディレクトリに移動してから、 scrapystartproject<プロジェクト名>を実行します。 。以下では、プロジェクト名にscrapy_exampleを使用しています-

C:\Users\rajesh>scrapy startproject scrapy_example
New Scrapy project 'scrapy_example', using template directory 'c:\python\python361\lib\site-packages\scrapy\templates\project', created in:
C:\Users\rajesh\scrapy_example

You can start your first spider with:
cd scrapy_example
scrapy genspider example example.com

C:\Users\rajesh>cd scrapy_example
C:\Users\rajesh\scrapy_example>tree /F
Folder PATH listing
Volume serial number is 8CD6-8D39
C:.
│ scrapy.cfg
│
└───scrapy_example
  │ items.py
  │ middlewares.py
  │ pipelines.py
  │ settings.py
  │ __init__.py
  │
  ├───spiders
  │ │ __init__.py
  │ │
  │ └───__pycache__
  └───__pycache__

もう1つの方法は、以下のように、スクレイピングシェルを実行してWebスクレイピングを実行することです-

In [18]: fetch ("https://www.wsj.com/india")
019-02-04 22:38:53 [scrapy.core.engine] DEBUG: Crawled (200) " rel="nofollow noopener noreferrer" target="_blank">https://www.wsj.com/india> (referer: None)

スクレイプクローラーは、ダウンロードされた情報を含む「応答」オブジェクトを返します。上記のクローラーに何が含まれているかを確認しましょう-

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

また、デフォルトのブラウザでは、Webリンクが開き、-

のようなものが表示されます。

PythonとScrapyを使用したWebスクレイピング?

すばらしい、それは私たちのWebページにいくぶん似ているので、クローラーはWebページ全体を正常にダウンロードしました。

それでは、クローラーに含まれるものを見てみましょう-

In [22]: print(response.text)
<!DOCTYPE html>
<html data-region = "asia,india" data-protocol = "https" data-reactid = ".2316x0ul96e" data-react-checksum = "851122071">
   <head data-reactid = ".2316x0ul96e.0">
      <title data-reactid = ".2316x0ul96e.0.0">The Wall Street Journal & Breaking News, Business,   Financial and Economic News, World News and Video</title>
      <meta http-equiv = "X-UA-Compatible" content = "IE = edge" data-reactid = ".2316x0ul96e.0.1"/>
      <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8" data-reactid = ".2316x0ul96e.0.2"/>
      <meta name = "viewport" content = "initial-scale = 1.0001, minimum-scale = 1.0001, maximum-scale = 1.0001, 
         user-scalable = no" data-reactid = ".2316x0ul96e.0.3"/>
      <meta name = "description" content = "WSJ online coverage of breaking news and current headlines from the
         US and around the world. Top stories, photos, videos, detailed analysis and in-depth reporting." data-reactid = ".2316x0ul96e.0.4"/>
      <meta name = "keywords" content = "News, breaking news, latest news, US news, headlines, world news, 
         business, finances, politics, WSJ, WSJ news, WSJ.com, Wall Street Journal" data-reactid = ".2316x0ul96e.0.5"/>
      <meta name = "page.site" content = "wsj" data-reactid = ".2316x0ul96e.0.7"/>
      <meta name = "page.site.product" content = "WSJ" data-reactid = ".2316x0ul96e.0.8"/>
      <meta name = "stack.name" content = "dj01:vir:prod-sections" data-reactid = ".2316x0ul96e.0.9"/>
      <meta name = "referrer" content = "always" data-reactid = ".2316x0ul96e.0.a"/>
      <link rel = "canonical" href = "https://www.wsj.com/india/" data-reactid = ".2316x0ul96e.0.b"/>
      <meta nameproperty = "og:url" content = "https://www.wsj.com/india/" data-reactid = ".2316x0ul96e.0.c:$0"/>
      <meta nameproperty = "og:title" content = "The Wall Street Journal & Breaking News, Business, Financial 
         and Economic News, World News and Video" data-reactid = ".2316x0ul96e.0.c:$1"/>
      <meta nameproperty = "og:description" content = "WSJ online coverage of breaking news and current 
         headlines from the US and around the world. Top stories, photos, videos, detailed analysis and in-depth reporting." data-reactid = ".2316x0ul96e.0.c:$2"/>
      <meta nameproperty = "og:type" content = "website" data-reactid = ".2316x0ul96e.0.c:$3"/>
      <meta nameproperty = "og:site_name" content = "The Wall Street Journal" data-reactid = ".2316x0ul96e.0.c:$4"/>
      <meta nameproperty = "og:image" content = "https://s.wsj.net/img/meta/wsj-social-share.png" data-reactid = ".2316x0ul96e.0.c:$5"/>
      <meta name = "twitter:site" content = "@wsj" data-reactid = ".2316x0ul96e.0.c:$6"/>
      <meta name = "twitter:app:name:iphone" content = "The Wall Street Journal" data-reactid = ".2316x0ul96e.0.c:$7"/>
      <meta name = "twitter:app:name:googleplay" content = "The Wall Street Journal" data-reactid = " "/>
…& so much more:

このウェブページからいくつかの重要な情報を抽出してみましょう-

ウェブページの正確なタイトル-

Scrapyは、クラス、IDなどのcssセレクターに基づいてHTMLから情報を抽出する方法を提供します。任意のWebページタイトルのタイトルのcssセレクターを見つけるには、以下のように右クリックして[検査]をクリックします。

PythonとScrapyを使用したWebスクレイピング?

これにより、ブラウザウィンドウで開発者ツールが開きます-

PythonとScrapyを使用したWebスクレイピング?

ご覧のとおり、cssクラス「wsj-headline-link」は、タイトルを持つすべてのanchor()タグに適用されます。この情報を使用して、応答オブジェクトの残りのコンテンツからすべてのタイトルを検索しようとします-

PythonとScrapyを使用したWebスクレイピング?

response.css()は、渡されたcssセレクター(上記のアンカータグなど)に基づいてコンテンツを抽出する関数です。 response.css関数の例をもう少し見てみましょう。

In [24]: response.css(".wsj-headline-link::text").extract_first()

Out[24]: 'China Fears Loom Over Stocks After January Surge'

および

In [25]: response.css(".wsj-headline-link").extract_first()

Out[25]: '<a class="wsj-headline-link" href = "https://www.wsj.com/articles/china-fears-loom-over-stocks-after-january-surge-11549276200" data-reactid=".2316x0ul96e.1.1.5.1.0.3.3.0.0.0:$0.1.0">China Fears Loom Over Stocks After January Surge</a>'

Webページからすべてのリンクを取得するには-

links = response.css('a::attr(href)').extract()

出力

['https://www.google.com/intl/en_us/chrome/browser/desktop/index.html',
'https://support.apple.com/downloads/',
'https://www.mozilla.org/en-US/firefox/new/',
'https://windows.microsoft.com/en-us/internet-explorer/download-ie',
'https://www.barrons.com',
'https://bigcharts.marketwatch.com',
'https://www.wsj.com/public/page/wsj-x-marketing.html',
'https://www.dowjones.com/',
'https://global.factiva.com/factivalogin/login.asp?productname=global',
'https://www.fnlondon.com/',
'https://www.mansionglobal.com/',
'https://www.marketwatch.com',
'https://newsplus.wsj.com',
'https://privatemarkets.dowjones.com',
'https://djlogin.dowjones.com/login.asp?productname=rnc',
'https://www.wsj.com/conferences',
'https://www.wsj.com/pro/centralbanking',
'https://www.wsj.com/video/',
'https://www.wsj.com',
'https://www.bigdecisions.com/',
'https://www.businessspectator.com.au/',
'https://www.checkout51.com/?utm_source=wsj&utm_medium=digitalhousead&utm_campaign=wsjspotlight',
'https://www.harpercollins.com/',
'https://housing.com/',
'https://www.makaan.com/',
'https://nypost.com/',
'https://www.newsamerica.com/',
'https://www.proptiger.com',
'https://www.rea-group.com/',
……
……

wsj(ウォールストリートジャーナル)のウェブページからコメント数を取得するには-

In [38]: response.css(".wsj-comment-count::text").extract()

Out[38]: ['71', '59']

上記は、scrapyを介したWebスクレイピングの概要です。scrapyを使用すると、さらに多くのことができます。


  1. Webスクレイピング用のPythonツール

    コンピュータサイエンスでは、WebスクレイピングとはWebサイトからデータを抽出することを意味します。この手法を使用すると、ウェブ上の非構造化データが構造化データに変換されます。 Python3で最も一般的なWebスクレイピングツールは-です。 Urllib2 リクエスト BeautifulSoup Lxml セレン MechanicalSoup Urllib2 −このツールにはPythonがプリインストールされています。このモジュールは、URLを抽出するために使用されます。さまざまなプロトコル(FTP、HTTPなど)を使用してURLをフェッチするurlopen()

  2. MacでのPython3のアップグレードと使用

    あなたはあなたの真新しいMacがすべての関連するソフトウェアの最新バージョンを持っていると思うかもしれません。ほとんどのユーザーアプリにとっては正しいでしょうが、基盤となるフレームワークにとっては別の話です。最新の安定版リリースはPython3.5ですが、新しいMacにはPython2.7.10が付属しています。これがバージョン間の大きなギャップのように思われる場合、それはそうだからです。ただし、新しいバージョンが必ずしも優れているとは限りません。Python3はPython 2と下位互換性がなく、ほとんどの開発者は引き続きPython2を使用しています。 2to3か2to3ではないか?