Если (URL-адрес не меняется между двумя страницами), тогда вы должны добавить dont_filter = True с вашим scrapy.Request () или scrapy найдет этот URL-адрес как дубликат после обработки первой страницы.
Если вам нужно отображать страницы с помощью javascript, вы должны использовать scrapy-splash, вы также можете проверить это промежуточное программное обеспечение scrapy, которое может обрабатывать 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.FormRequest () вместо scrapy.Request (), оба одинаковы, но FormRequest добавляет новый аргумент (formdata =) конструктора.
Вот еще один пример паука из этого сообщения:
class SpiderClass(scrapy.Spider):
# spider name and all
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', ''))
# your code here
# pagination code starts here
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
person
muhive
schedule
27.04.2019