3

http://community.sellfree.co.kr/からデータを抽出したい。Scrapy は機能していますがstart_urls、.

スパイダーにサイト全体をクロールしてもらいたいです。

以下は私のコードです:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

from metacritic.items import MetacriticItem
class MetacriticSpider(BaseSpider):
    name = "metacritic" # Name of the spider, to be used when crawling
    allowed_domains = ["sellfree.co.kr"] # Where the spider is allowed to go
    start_urls = [
        "http://community.sellfree.co.kr/"
    ]
    rules = (Rule (SgmlLinkExtractor(allow=('.*',))
          ,callback="parse", follow= True),
        )

    def parse(self, response):
        hxs = HtmlXPathSelector(response) # The XPath selector
        sites = hxs.select('/html/body')
        items = []
        for site in sites:
            item = MetacriticItem()
            item['title'] = site.select('//a[@title]').extract()
            items.append(item)
        return items

ページには 2 種類のリンクがあります。1つはonclick="location='../bbs/board.php?bo_table=maket_5_3'あり、もう1つは<a href="../bbs/board.php?bo_table=maket_5_1&amp;sca=프로그램/솔루션"><span class="list2">solution</span></a>

クローラーに両方の種類のリンクをたどらせるにはどうすればよいですか?

4

1 に答える 1

2

始める前に、最新バージョンの Scrapy を使用することを強くお勧めします。使用しているメソッド/クラスの多くが移動または廃止されたため、まだ古いものを使用しているようです。

当面の問題に対して:scrapy.spiders.BaseSpiderクラスは指定したものでは何もしませんrules。代わりに、scrapy.contrib.spiders.CrawlSpiderルールを処理する機能が組み込まれたクラスを使用してください。

parse()次に、メソッドを新しい名前に切り替える必要がありCrawlSpiderますparse()parse_page()(この回答の残りの部分では仮定します)

すべての基本的なリンクを取得してクロールするには、リンク エクストラクタを変更する必要があります。デフォルトでは、フォローしたいドメインに正規表現構文を使用しないでください。以下はそれを拾い上げ、あなたDUPEFILTERはサイトにないリンクを除外します:

rules = (
    Rule(SgmlLinkExtractor(allow=('')), callback="parse_page", follow=True),
)

リンクに関してはonclick=...、これらは JavaScript リンクであり、処理しようとしているページは JavaScript リンクに大きく依存しています。Scrapy はonclick=location.href="javascript:showLayer_tap('2')"またはのようなものをクロールできません。これは、またはJavascript でonclick="win_open('./bbs/profile.php?mb_id=wlsdydahs'実行できないためです。showLayer_tap()win_open()

(以下はテストされていませんが、動作し、何をする必要があるかについての基本的な考え方を提供するはずです)

ただし、これらを解析するための独自の関数を作成できます。たとえば、次のように処理できますonclick=location.href="./photo/"

def process_onclick(value):
    m = re.search("location.href=\"(.*?)\"", value)
    if m:
        return m.group(1)

次に、次のルールを追加します (これはテーブルのみを処理し、必要に応じて展開します)。

Rule(SgmlLinkExtractor(allow=(''), tags=('table',), 
                       attrs=('onclick',), process_value=process_onclick), 
     callback="parse_page", follow=True),
于 2015-09-22T23:33:57.553 に答える