(URLが2つのページ間で変更されない)場合は、dont_filter = Trueを追加する必要があります、scrapy.Request()でをがあります。そうしないと、scrapyは最初のページの処理後にこのURLを重複として検出します。
javascriptでページをレンダリングする必要がある場合は、scrapy-splashを使用する必要があります。また、このScrapyミドルウェアを確認することもできます。 seleniumを使用してjavascriptページを処理できるをするか、ヘッドレスブラウザを起動してそれを行うことができます。
しかし、より効果的で高速な解決策は、ブラウザーを検査して、フォームの送信中または特定のイベントのトリガー中に行われた要求を確認することです。ブラウザが送信するのと同じリクエストをシミュレートしてみてください。リクエストを正しく複製できれば、必要なデータを取得できます。
ここに例があります:
class ScrollScraper(Spider):
name = "scrollingscraper"
quote_url = "http://quotes.toscrape.com/api/quotes?page="
start_urls = [quote_url + "1"]
def parse(self, response):
quote_item = QuoteItem()
print response.body
data = json.loads(response.body)
for item in data.get('quotes', []):
quote_item["author"] = item.get('author', {}).get('name')
quote_item['quote'] = item.get('text')
quote_item['tags'] = item.get('tags')
yield quote_item
if data['has_next']:
next_page = data['page'] + 1
yield Request(self.quote_url + str(next_page))
ページネーションURLがすべてのページで同じでPOSTリクエストを使用する場合、scrapy.Request()の代わりにscrapy.FormRequest()を使用できます。どちらも同じですが、FormRequestは新しい引数を追加します(formdata =コンストラクターに)を。
これは、この投稿からの別のスパイダーの例です:
class SpiderClass(scrapy.Spider):
name = 'ajax'
page_incr = 1
start_urls = ['http://www.pcguia.pt/category/reviews/#paginated=1']
pagination_url = 'http://www.pcguia.pt/wp-content/themes/flavor/functions/ajax.php'
def parse(self, response):
sel = Selector(response)
if self.page_incr > 1:
json_data = json.loads(response.body)
sel = Selector(text=json_data.get('content', ''))
if sel.xpath('//div[@class="panel-wrapper"]'):
self.page_incr += 1
formdata = {
'sorter': 'recent',
'location': 'main loop',
'loop': 'main loop',
'action': 'sort',
'view': 'grid',
'columns': '3',
'paginated': str(self.page_incr),
'currentquery[category_name]': 'reviews'
}
yield FormRequest(url=self.pagination_url, formdata=formdata, callback=self.parse)
else:
return