1

私はPythonの初心者で、この夏からオンとオフで独学しています。私はスクレイピーのチュートリアルを進めており、スクレイピーを理解するのに役立つ html/xml について時々読んでいます。私のプロジェクトは、http://www.gamefaqs.com/boards/916373-pcをスクレイピングするためにスクレイピーのチュートリアルを模倣することです。スレッドのタイトルとスレッドの URL のリストを取得したいのですが、簡単なはずです。

私の問題は、xpathとhtmlを理解していないことにあります。gamefaqs サイトのソース コードを表示するとき、リンクとタイトルを取得するために何を探すべきかわかりません。アンカータグを見てテキストをつかむだけだと言いたいのですが、どうすればいいのか混乱しています。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from tutorial.items import DmozItem

class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains = ["http://www.gamefaqs.com"]
start_urls = ["http://www.gamefaqs.com/boards/916373-pc"]


def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//a')
    items = []
    for site in sites:
        item = DmozItem()
        item['link'] = site.select('a/@href').extract()
        item['desc'] = site.select('text()').extract()
        items.append(item)
    return items

これをgamefaqで動作するように変更したいので、このパスに何を入れますか? プログラムがこのスレッド名スレッド url のような結果を返すと思いますが、コードが正しくないことはわかっていますが、誰かがこれを書き直して結果を取得するのを手伝ってくれます。スクレイピング プロセスをよりよく理解するのに役立ちます。

4

1 に答える 1

2

Web ページのレイアウトと構成は変更される可能性があり、深いタグ ベースのパスは扱いが難しい場合があります。リンクのテキストをパターン マッチすることを好みます。リンクのフォーマットが変わっても、新しいパターンに合わせるのは簡単です。

gamefaqs の場合、記事のリンクは次のようになります。

http://www.gamefaqs.com/boards/916373-pc/37644384

それは、プロトコル、ドメイン名、文字通りの「ボード」パスです。「916373-pc」はフォーラム エリアを識別し、「37644384」は記事 ID です。

正規表現を使用して、特定のフォーラム エリアのリンクを照合できます。

reLink = re.compile(r'.*\/boards\/916373-pc\/\d+$')
if reLink.match(link)

または、以下を使用するフォーラム エリア:

reLink = re.compile(r'.*\/boards\/\d+-[^/]+\/\d+$')
if reLink.match(link)

コードにリンク マッチングを追加すると、次のようになります。

import re
reLink = re.compile(r'.*\/boards\/\d+-[^/]+\/\d+$')

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//a')
    items = []
    for site in sites:
        link = site.select('a/@href').extract()
        if reLink.match(link)
            item = DmozItem()
            item['link'] = link
            item['desc'] = site.select('text()').extract()
            items.append(item)
    return items

多くのサイトには、個別の概要ページと詳細ページ、または説明とファイルのリンクがあり、パスがテンプレートと記事 ID に一致しています。必要に応じて、次のようにフォーラム エリアと記事 ID を解析できます。

reLink = re.compile(r'.*\/boards\/(?P<area>\d+-[^/]+)\/(?P<id>\d+)$')
m = reLink.match(link)
if m:
    areaStr = m.groupdict()['area']
    idStr = m.groupdict()['id']

isStrURL テンプレートに入力するのに適した文字列になりますが、以前の ID などを計算する必要がある場合は、数値に変換します。

idInt = int(idStr)

これが役立つことを願っています。

于 2012-11-20T01:01:21.857 に答える