Скрап только соскоб первые две страницы - PullRequest
2 голосов
/ 10 февраля 2020

Я пытаюсь очистить сайт, но мне нужно использовать spla sh на всех страницах, потому что их содержимое создается динамически. Сейчас он рендерит только первые 2 страницы, хотя их всего 47 страниц.

Вот код:

import scrapy
from scrapy.http import Request
from scrapy_splash import SplashRequest

class JobsSpider(scrapy.Spider):
    name = 'jobs'
    start_urls = ['https://jobs.citizensbank.com/search-jobs']

    def start_requests(self):
        filters_script = """function main(splash)
                                assert(splash:go(splash.args.url))
                                splash:wait(3)
                                return splash:html()
                            end"""

        for url in self.start_urls:
            yield SplashRequest(url=url,
                                callback=self.parse,
                                endpoint='execute',
                                args={'lua_source': filters_script})

    def parse(self, response):
        cars_urls = response.xpath('.//section[@id="search-results-list"]/ul/li/a/@href').extract()
        for car_url in cars_urls:
            absolute_car_url = response.urljoin(car_url)
            yield scrapy.Request(absolute_car_url,
                          callback=self.parse_car)

        script_at_page_1 = """function main(splash)
                                assert(splash:go(splash.args.url))
                                splash:wait(3)

                                next_button = splash:select("a[class=next]")
                                next_button.mouse_click()
                                splash:wait(3)
                                return {
                                    url = splash:url(),
                                    html = splash:html()
                                }
                            end"""

        script_at_page_2 = """function main(splash)
                                assert(splash:go(splash.args.url))
                                splash:wait(3)

                                next_button = splash:select("a[class=next]")
                                next_button.mouse_click()
                                splash:wait(3)
                                return {
                                    url = splash:url(),
                                    html = splash:html()
                                }
                            end"""

        script = None
        if response.url is not self.start_urls[0]:
            script = script_at_page_2
        else:
            script = script_at_page_1

        yield SplashRequest(url=response.url,
                            callback=self.parse,
                            endpoint='execute',
                            args={'lua_source': script})


    def parse_car(self, response):
        jobtitle = response.xpath('//h1[@itemprop="title"]/text()').extract_first()
        location = response.xpath('//span[@class="job-info"]/text()').extract_first()
        jobid = response.xpath('//span[@class="job-id job-info"]/text()').extract_first()

        yield {'jobtitle': jobtitle,
                'location': location,
                'jobid': jobid}

Я играл с ним всеми возможными способами выкл, но это не сработало. Я новичок в области терапии, поэтому любая помощь приветствуется.

1 Ответ

2 голосов
/ 10 февраля 2020

Я думаю, вам не нужно использовать Spla sh для этого. Если вы посмотрите на вкладку «Сеть» вашего инспектора браузера, то увидите, что он отправляет запросы на этот URL-адрес в XHR:

https://jobs.citizensbank.com/search-jobs/results?ActiveFacetID=0&CurrentPage=3&RecordsPerPage=15&Distance=50&RadiusUnitType=0&Keywords=&Location=&Latitude=&Longitude=&ShowRadius=False&CustomFacetName=&FacetTerm=&FacetType=0&SearchResultsModuleName=Search+Results&SearchFiltersModuleName=Search+Filters&SortCriteria=0&SortDirection=0&SearchType=5&CategoryFacetTerm=&CategoryFacetType=&LocationFacetTerm=&LocationFacetType=&KeywordType=&LocationType=&LocationPath=&OrganizationIds=&PostalCode=&fc=&fl=&fcf=&afc=&afl=&afcf=

Попробуйте выполнить запросы к этому URL и меняйте страницу каждый раз. Если у вас возникли проблемы, вам может понадобиться посмотреть заголовки запроса XHR и скопировать их. Если вы нажмете на ссылку, JSON загрузится в ваш браузер. Так что просто установите страницу 1 в качестве start_url и перезапуска start_requests следующим образом:

start_urls = ['https://jobs.citizensbank.com/search-jobs/results?ActiveFacetID=0&CurrentPage={}&RecordsPerPage=15&Distance=50&RadiusUnitType=0&Keywords=&Location=&Latitude=&Longitude=&ShowRadius=False&CustomFacetName=&FacetTerm=&FacetType=0&SearchResultsModuleName=Search+Results&SearchFiltersModuleName=Search+Filters&SortCriteria=0&SortDirection=0&SearchType=5&CategoryFacetTerm=&CategoryFacetType=&LocationFacetTerm=&LocationFacetType=&KeywordType=&LocationType=&LocationPath=&OrganizationIds=&PostalCode=&fc=&fl=&fcf=&afc=&afl=&afcf=']

def start_requests(self):
    num_pages = 10
    for page in range(1, num_pages):
        yield scrapy.Request(self.start_urls[0].format(page), callback=self.parse)

Стоит также отметить, что вы можете установить параметр RecordsPerPage. Вы можете установить его выше и, возможно, получить все записи на одной странице или сделать меньше запросов для получения всех записей.

...