1

私はスクレイピーを使用しており、www.rentler.com をスクレイピングしたいと考えています。ウェブサイトにアクセスして、興味のある都市を検索しました。その検索結果のリンクは次のとおりです。

https://www.rentler.com/search?Location=millcreek&MaxPrice=

ここで、関心のあるすべてのリストがそのページに含まれているので、それらを 1 つずつ再帰的に処理したいと考えています。

各リストは以下にリストされています。

<body>/<div id="wrap">/<div class="container search-res">/<ul class="search-results"><li class="result">

各結果には<a class="search-result-link" href="/listing/288910">

クロールスパイダーのルールを作成し、href を参照して URL に追加する必要があることはわかっています。そうすれば、各ページに移動して、興味のあるデータを取得できます。

私はこのようなものが必要だと思います:

rules = (Rule(SgmlLinkExtractor(allow="not sure what to insert here, but this is where I think I need to href appending", callback='parse_item', follow=true),)

更新 *入力していただきありがとうございます。これが私が今持っているものです。実行しているように見えますが、こすりません: *

import re
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from KSL.items import KSLitem

class KSL(CrawlSpider):
    name = "ksl"
    allowed_domains = ["https://www.rentler.com"]
    start_urls = ["https://www.rentler.com/ksl/listing/index/?sid=17403849&nid=651&ad=452978"]
    regex_pattern = '<a href="listing/(.*?) class="search-result-link">'

    def parse_item(self, response):
        items = []
        hxs = HtmlXPathSelector(response)
        sites = re.findall(regex_pattern, "https://www.rentler.com/search?location=millcreek&MaxPrice=")

        for site in sites:
            item = KSLitem()
            item['price'] = site.select('//div[@class="price"]/text()').extract()
            item['address'] = site.select('//div[@class="address"]/text()').extract()
            item['stats'] = site.select('//ul[@class="basic-stats"]/li/div[@class="count"]/text()').extract()
            item['description'] = site.select('//div[@class="description"]/div/p/text()').extract()
            items.append(item)
        return items

考え?

4

2 に答える 2

7

html ファイルからデータをスクレイピングする必要がある場合は、BeautifulSoupを使用することをお勧めします。インストールと使用は非常に簡単です。

from bs4 import BeautifulSoup

bs = BeautifulSoup(html)
for link in bs.find_all('a'):
    if link.has_attr('href'):
        print link.attrs['href']

この小さなスクリプトは、HTML タグhref内にあるすべてのものを取得します。a

編集:完全に機能するスクリプト:

これを自分のコンピューターでテストしたところ、結果は予想どおりでした。BeautifulSoup にはプレーンな HTML が必要であり、そこから必要なものをスクレイピングできます。次のコードを見てください。

import requests
from bs4 import BeautifulSoup

html = requests.get(
    'https://www.rentler.com/search?Location=millcreek&MaxPrice=').text
bs = BeautifulSoup(html)
possible_links = bs.find_all('a')
for link in possible_links:
    if link.has_attr('href'):
        print link.attrs['href']

これは、スクレイピングしようとしている html ページから href をスクレイピングする方法を示しているだけです。もちろん、スクレイピー内で使用することもできます。言ったように、BeautifulSoup にはプレーンな HTML しか必要requests.get(url).textありません。それ。したがって、scrapy はプレーンな HTML を BeautifulSoup に渡すことができると思います。

編集 2 わかりました、スクレイピーはまったく必要ないと思います。そのため、前のスクリプトで作品からデータを取得したいすべてのリンクが取得された場合は、次のようなことを行うだけで済みます。

価格、エーカー、住所など、特定のデータを取得したいURLの有効なリストがあるとします... URLを画面に出力する代わりに、前のスクリプトでのみこれを使用できます。それらをリストに追加して追加するだけですで始まるもの/listing/。そうすれば、有効な URL のリストを取得できます。

for url in valid_urls:
    bs = BeautifulSoup(requests.get(url).text)
    price = bs.find('span', {'class': 'amount'}).text
    print price

ソースコードを見るだけで、すべての URL から必要なデータを取得する方法がわかります。

于 2013-10-17T14:19:47.843 に答える