2016-12-25 15 views
1

をクロールすることは、私のScrapyコードです...Scrapyだけここで1ページ

import scrapy 

class NewsSpider(scrapy.Spider): 
name = "news" 
start_urls = ['http://www.StartURL.com/scrapy/all-news-listing'] 
allowed_domains = ["www.xxxxx.com"] 

def parse(self, response): 
    for news in response.xpath('head'): 
     yield { 
    'pagetype': news.xpath('//meta[@name="pdknpagetype"]/@content').extract(), 
    'pagetitle': news.xpath('//meta[@name="pdknpagetitle"]/@content').extract(), 
    'pageurl': news.xpath('//meta[@name="pdknpageurl"]/@content').extract(), 
    'pagedate': news.xpath('//meta[@name="pdknpagedate"]/@content').extract(), 
    'pagedescription': news.xpath('//meta[@name="pdknpagedescription"]/@content').extract(), 
    'bodytext': [' '.join(item.split()) for item in (response.xpath('//div[@class="module__contentp"]/*/node()/text()').extract())], 
     } 

    next_page = response.css('p a::attr(href)').extract_first() 
    if next_page is not None: 
     next_page = response.urljoin(next_page) 
     yield scrapy.Request(next_page, callback=self.parse) 

マイstart_urlsページには、次のようになります。それは非常にシンプルなページと私はクロールするすべての3000のリンク/ URLのリスト...

<html> 
<head> 
<div> 
<p><a href="http://www.xxxxx.com/asdas-sdf/kkm">Page 1</a></p> 
<p><a href="http://www.xxxxx.com/vdfvd-asda/vdfvf/dfvd">Page 2</a></p> 
<p><a href="http://www.xxxxx.com/oiijo/uoiu/xwswd">Page 3</a></p> 
<p><a href="http://www.xxxxx.com/jnkjn-yutyy/hjj-sdf/plm">Page 4</a></p> 
<p><a href="http://www.xxxxx.com/unhb-oiiuio/hbhb/jhjh/qwer">Page 5</a></p> 
<p><a href="http://www.xxxxx.com/eres/popo-hbhh/oko-sdf/ynyt">Page 6</a></p> 
<p><a href="http://www.xxxxx.com/yhbb-ytyu/oioi/rtgb/ttyht">Page 7</a></p> 
.......... 
<p><a href="http://www.xxxxx.com/iojoij/uhuh/page3000">Page 3000</a></p> 
</div> 
</head> 
</html> 

私はこのページにScrapyを送信すると、それだけで最初のリンクすなわちhttp://www.xxxxx.com/page1と停止をクロール。 エラーは報告されていません。この再帰部分のように、かなり動作していないようです...!では、このコードを変更して3000個のURLのそれぞれに行き、いくつかの特定のフィールドを取得します。

「ルール」とScrapyの「LinkExtractor」オブジェクトを使用した他の同様の問題がありましたか?私は、私の要件が非常に単純なので、どちらかが必要かどうかはわかりません。

ご協力いただきありがとうございます。ありがとう

+0

あなたが例にURLを与えることができますか? next_page urlは恐らくdupeフィルタでフィルタリングされているので、next_page urlの発見におそらく欠陥があります。通常は、next_pageと言うURLを探しているか、ハイパーリンクされていないページのdivに従っています。例を教えることができれば、説明するのが簡単になります。 – Granitosaurus

+0

私は解決策を見つけました.....下記の私の更新コードをご覧ください... – Slyper

答えて

0

私が疑問に思ったように、それは確かに再帰ロジックの欠陥でした。

次のコードは、最後の2行は再帰マジックをやった

from scrapy.selector import Selector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 

class MySpider(BaseSpider): 
    name = "pdknnews" 
    start_urls = ['http://www.example.com/scrapy/all-news-listing/'] 
    allowed_domains = ["example.com"] 

    def parse(self, response): 
     hxs = Selector(response) 
     for news in response.xpath('head'): 
    yield { 
     'pagetype': news.xpath('.//meta[@name="pdknpagetype"]/@content').extract(), 
     'pagetitle': news.xpath('.//meta[@name="pdknpagetitle"]/@content').extract(), 
     'pageurl': news.xpath('.//meta[@name="pdknpageurl"]/@content').extract(), 
     'pagedate': news.xpath('.//meta[@name="pdknpagedate"]/@content').extract(), 
     'pagedescription': news.xpath('.//meta[@name="pdknpagedescription"]/@content').extract(), 
     'bodytext': [' '.join(item.split()) for item in (response.xpath('.//div[@class="module__content"]/*/node()/text()').extract())], 
      } 
    for url in hxs.xpath('//ul[@class="scrapy"]/li/a/@href').extract(): 
      yield Request(url, callback=self.parse) 

....私の問題を解決しました...

0

http://www.xxxxx.com/page1のようなページをリクエストするたびに、ページのページバーが変更されない場合、同じ結果がnext_page = response.css('p a::attr(href)').extract_first()になることがあります。 それを行うには良い方法があります:

start_urls = ['http://www.xxxxx.com/page{}'.format(i) for i in range(the last page number)] 

この方法では、コールバックを使用する必要はありません。

このコードではallowed_domains = ["www.xxxxx.com"]は必須ではありませんが、これはもう1つの理由です。

+0

こんにちは、ありがとうございます。ページベースURLは変更/変更されます。 – Slyper

関連する問題