2

Scrapy を使用して craigslist をスクレイピングしようとしていますが、URL の取得に成功しましたが、今は url のページ内からデータを抽出したいと考えています。以下はコードです:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from craigslist.items import CraigslistItem

class craigslist_spider(BaseSpider):
    name = "craigslist_unique"
    allowed_domains = ["craiglist.org"]
    start_urls = [
        "http://sfbay.craigslist.org/search/sof?zoomToPosting=&query=&srchType=A&addFour=part-time",
        "http://newyork.craigslist.org/search/sof?zoomToPosting=&query=&srchType=A&addThree=internship",
    "http://seattle.craigslist.org/search/sof?zoomToPosting=&query=&srchType=A&addFour=part-time"
    ]


def parse(self, response):
   hxs = HtmlXPathSelector(response)
   sites = hxs.select("//span[@class='pl']")
   items = []
   for site in sites:
       item = CraigslistItem()
       item['title'] = site.select('a/text()').extract()
       item['link'] = site.select('a/@href').extract()
   #item['desc'] = site.select('text()').extract()
       items.append(item)
   hxs = HtmlXPathSelector(response)
   #print title, link        
   return items

私はスクレイピーが初めてで、実際にURL(href)にアクセスしてそのURLのページ内でデータを取得し、すべてのURLに対してそれを行う方法を理解できません。

4

2 に答える 2

1

メソッドstart_urlsで一つずつ受け取るの応答parse

その応答から情報を取得したいだけの場合start_urls、コードはほとんど問題ありません。ただし、解析メソッドはcraigslist_spider、そのクラスの外ではなく、クラス内にある必要があります。

def parse(self, response):
   hxs = HtmlXPathSelector(response)
   sites = hxs.select("//span[@class='pl']")
   items = []
   for site in sites:
       item = CraigslistItem()
       item['title'] = site.select('a/text()').extract()
       item['link'] = site.select('a/@href').extract()
       items.append(item)
   #print title, link
   return items

start_urls から半分の情報を取得し、 responseanchorに存在するから半分を取得したい場合はどうなりますstart_urlsか?

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select("//span[@class='pl']")
    for site in sites:
        item = CraigslistItem()
        item['title'] = site.select('a/text()').extract()
        item['link'] = site.select('a/@href').extract()
        if item['link']:
            if 'http://' not in item['link']:
                item['link'] = urljoin(response.url, item['link'])
            yield Request(item['link'],
                          meta={'item': item},
                          callback=self.anchor_page)


def anchor_page(self, response):
    hxs = HtmlXPathSelector(response)
    old_item = response.request.meta['item'] # Receiving parse Method item that was in Request meta
    # parse some more values
    #place them in old_item
    #e.g
    old_item['bla_bla']=hxs.select("bla bla").extract()
    yield old_item

yield Requestparse メソッドをold item使用して出荷する必要があるだけmetaですRequest

次に、そこに新しい値を追加して抽出old_itemし、単純に生成します。anchor_page

于 2013-05-27T07:31:51.203 に答える