Веб-парсинг Python при разбивке на страницы в одностраничном приложении
В настоящее время я изучаю, как очистить веб-контент с помощью Python в разбивке на страницы, управляемой javascript в одностраничном приложении (SPA).
Например, https://angular-8-pagination-example.stackblitz.io/
Я погуглил и обнаружил, что с помощью Scrapy невозможно очистить контент, управляемый javascript / SPA. Для этого нужно использовать Splash. Я новичок в Scrapy и Splash. Это правильно?
Кроме того, как мне вызвать метод разбивки на страницы javascript? Я проверяю элемент, это просто якорь без событий href и javascript.
Пожалуйста, порекомендуйте.
Спасибо,
Hatjhie
1 ответ
Вам нужно использовать SpalshRequest для рендеринга JS. Затем вам нужно получить текст нумерации страниц. Обычно я использую re.search с соответствующим шаблоном регулярного выражения для извлечения соответствующих чисел. Затем вы можете назначить их переменной текущей страницы и общим переменным страниц.
Обычно веб-сайт переходит на следующую страницу, увеличивая? Page = x или? P = x в конце URL-адреса. Затем вы можете увеличить это значение, чтобы очистить все соответствующие страницы.
Общая картина выглядит так:
import scrapy
from scrapy_splash import SplashRequest
import re
from ..items import Item
proxy ='http//your.proxy.com:PORT'
current_page_xpath='//div[your x path selector]/text()'
last_page_xpath='//div[your other x path selector]/text()'
class spider(scrapy.Spider):
name = 'my_spider'
allowed_domains =['domain.com']
start_urls =['https://www.domaintoscrape.com/page=1']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse, meta ={'proxy':proxy})
def get_page_nbr(value):
#you may need more complex regex to get page numbers.
#most of the time they are in form "page X of Y"
#google is your friend
if re.search('\d+',value):
value = re.search('\d+',value)
value = value[0]
else:
value =None
return value
def parse(self, response):
#get last and current page from response:
last_page = page_response.xpath(last_page_xpath).get()
current_page = page_response.xpath(current_page_xpath).get()
#do something with your response
# if current page is less than last page make another request by incrmenenting the page in the URL
if current_page < last_page:
ajax_url = response.url.replace(f'page={int(current_page)}',f'page={int(current_page)+1}')
yield scrapy.Request(url=ajax_url, callback=self.parse, meta ={'proxy':proxy})
#optional
if current_page == last_page:
print(f'processed {last_page} items for {response.url}')
наконец, стоит взглянуть на Youtube, так как есть несколько руководств по scrapy_splash и разбиению на страницы.