ホームページ >バックエンド開発 >Python チュートリアル >Scrapy が大学のニュースレポートの例をキャプチャ

Scrapy が大学のニュースレポートの例をキャプチャ

PHP中文网
PHP中文网オリジナル
2017-06-21 10:47:111708ブラウズ

四川大学行政学院の公式 Web サイトからすべてのニュースに関する問い合わせを受信します ()。

実験プロセス

1. クローリング ターゲットを決定します。

2. クローリング ルールを作成します。
3.
4. クロールされたデータを取得します

1. クロール対象を決定します

今回クロールする対象は四川大学公共政策管理学院のすべてのニュース情報ですので、レイアウト構造を知る必要があります。


WeChat Screenshot_20170515223045.png
ここで、すべてのニュース情報をキャプチャしたい場合、公式 Web サイトのホームページでは直接キャプチャできないことがわかりました。一般的なニュース列に入るには、[詳細] をクリックする必要があります。


Paste_Image .png

特定のニュース列を見ましたが、これは明らかにクロールのニーズを満たしていません。現在のニュース Web ページはクロールのみ可能です。ニュースの時刻、タイトル、URL はクロールできませんが、ニュースの詳細ページに移動して、ニュースの特定のコンテンツをキャプチャする必要があります

を通じて。最初の部分の分析では、ニュースの特定の情報を取得したい場合は、ニュース ページをクリックしてニュースの詳細ページに入り、ニュースの特定の内容を取得する必要があると考えます。試してみてください

Paste_Image.png
ニュースの詳細ページで必要なものを直接取得できることがわかりました。データ: タイトル、時間、内容。URL。
さて、これで、次のアイデアがわかりました。ニュースを取得します。しかし、すべてのニュース コンテンツをクロールするにはどうすればよいでしょうか?

これは私たちにとって明らかに難しいことではありません。


その後、ニュース列の下部にページ ジャンプ ボタンが表示されます。

それでは、考えを整理した後、明らかなキャプチャのルールを考えることができます:
「ニュースセクション」の下にあるすべてのニュースリンクをキャッチし、ニュースの詳細リンクを入力してすべてのニュースを取得します。

3. 「書き込み/デバッグ」クローリングルール

クローラーをデバッグするために、できるだけ粒度を小さくして、書き込みモジュールとデバッグモジュールを組み合わせます

クローラーでは、以下を実装します。機能ポイント:


1. ページのニュース列の下にあるすべてのニュース リンクをクロールします

2. クロールされたニュース リンクにニュースの詳細が入力され、必要なデータ (主にニュース コンテンツ) がクロールされます
3.



対応するナレッジ ポイントは次のとおりです。

1. クロールする。

2. クロールされたデータをすべてクロールします。ページをループします


さっそく始めましょう

3.1 1 ページのニュース列の下にあるすべてのニュース リンクを表示します

のソース コードを分析します。ニュース列で、キャプチャされたデータの構造が

Paste_Image.png

であることがわかりました。その後、クローラーのセレクターを (li:newsinfo_box_cf) に配置し、for ループを実行してクロールするだけです。

コードを書いてください
import scrapyclass News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = ["http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]def parse(self, response):for href in response.xpath("//div[@class='newsinfo_box cf']"):
            url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

テストして合格してください!

Paste_Image.png

3.2 クロールされたニュースリンクからニュースの詳細を入力し、必要なデータ (主にニュースコンテンツ) をクロールします

これで、必要なタイトルをクロールするには、各 URL を入力する必要があります。元のコードが URL をキャプチャするときは、URL を入力して対応するデータをキャプチャするだけで済みます。したがって、ニュースの詳細ページに入るために別のキャプチャ メソッドを作成するだけで済み、
コードを記述して
#进入新闻详情页的抓取方法
def parse_dir_contents(self, response):item = GgglxyItem()item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()item['href'] = responseitem['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
        data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")item['content'] = data[0].xpath('string(.)').extract()[0]
        yield item
を呼び出すだけです:
import scrapyfrom ggglxy.items import GgglxyItemclass News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = ["http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]def parse(self, response):for href in response.xpath("//div[@class='newsinfo_box cf']"):
            url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())#调用新闻抓取方法yield scrapy.Request(url, callback=self.parse_dir_contents)#进入新闻详情页的抓取方法                def parse_dir_contents(self, response):
            item = GgglxyItem()
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0]yield item

テストに合格しました。 !

Paste_Image.png

この時点で、ループを追加します:

NEXT_PAGE_NUM = 1 

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1if NEXT_PAGE_NUM<11:next_url = &#39;http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s&#39; % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse)
元のコードに追加:
import scrapyfrom ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = ["http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]def parse(self, response):for href in response.xpath("//div[@class=&#39;newsinfo_box cf&#39;]"):
            URL = response.urljoin(href.xpath("div[@class=&#39;news_c fr&#39;]/h3/a/@href").extract_first())yield scrapy.Request(URL, callback=self.parse_dir_contents)global NEXT_PAGE_NUM
        NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1if NEXT_PAGE_NUM<11:
            next_url = &#39;http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s&#39; % NEXT_PAGE_NUMyield scrapy.Request(next_url, callback=self.parse) def parse_dir_contents(self, response):
            item = GgglxyItem() 
            item[&#39;date&#39;] = response.xpath("//div[@class=&#39;detail_zy_title&#39;]/p/text()").extract_first()
            item[&#39;href&#39;] = response 
            item[&#39;title&#39;] = response.xpath("//div[@class=&#39;detail_zy_title&#39;]/h1/text()").extract_first()
            data = response.xpath("//div[@class=&#39;detail_zy_c pb30 mb30&#39;]")
            item[&#39;content&#39;] = data[0].xpath(&#39;string(.)&#39;).extract()[0] yield item

Test:

Paste_Image.png

抓到的数量为191,但是我们看官网发现有193条新闻,少了两条.
为啥呢?我们注意到log的error有两条:
定位问题:原来发现,学院的新闻栏目还有两条隐藏的二级栏目:
比如:


Paste_Image.png


对应的URL为


Paste_Image.png


URL都长的不一样,难怪抓不到了!
那么我们还得为这两条二级栏目的URL设定专门的规则,只需要加入判断是否为二级栏目:

  if URL.find(&#39;type&#39;) != -1:      yield scrapy.Request(URL, callback=self.parse)

组装原函数:

import scrapy
from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = ["http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]def parse(self, response):for href in response.xpath("//div[@class=&#39;newsinfo_box cf&#39;]"):
            URL = response.urljoin(href.xpath("div[@class=&#39;news_c fr&#39;]/h3/a/@href").extract_first())if URL.find(&#39;type&#39;) != -1:yield scrapy.Request(URL, callback=self.parse)yield scrapy.Request(URL, callback=self.parse_dir_contents)
        global NEXT_PAGE_NUM
        NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1if NEXT_PAGE_NUM<11:
            next_url = &#39;http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s&#39; % NEXT_PAGE_NUMyield scrapy.Request(next_url, callback=self.parse) def parse_dir_contents(self, response):
            item = GgglxyItem() 
            item[&#39;date&#39;] = response.xpath("//div[@class=&#39;detail_zy_title&#39;]/p/text()").extract_first()
            item[&#39;href&#39;] = response 
            item[&#39;title&#39;] = response.xpath("//div[@class=&#39;detail_zy_title&#39;]/h1/text()").extract_first()
            data = response.xpath("//div[@class=&#39;detail_zy_c pb30 mb30&#39;]")
            item[&#39;content&#39;] = data[0].xpath(&#39;string(.)&#39;).extract()[0] yield item

测试:


Paste_Image.png

我们发现,抓取的数据由以前的193条增加到了238条,log里面也没有error了,说明我们的抓取规则OK!

4.获得抓取数据

<code class="haxe">     scrapy crawl <span class="hljs-keyword">new<span class="hljs-type">s_info_2 -o <span class="hljs-number">0016.json</span></span></span></code><br/><br/>

以上がScrapy が大学のニュースレポートの例をキャプチャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。