соскоблить патенты Google с помощью скрапа не удается при разбиении на страницы

#python #web-scraping #scrapy

Вопрос:

Мне нужно получить номера публикаций в Google Patents. Пример имен, которые мне нужны, что-то вроде этого US7863316B2, KR102121633B1. Я разработал скребок с помощью scrapy, который работает для одного URL-адреса, но когда я пытаюсь использовать несколько URL-адресов, это не удается. С помощью селектора xpath я пытаюсь реализовать разбиение на страницы и проверить, есть ли div[@id=»resultsContainer»]/раздел[@class=»стиль-область поиска-результаты»]/поиск-результат-элемент этого элемента. Если есть этот элемент, я увеличиваю номер страницы и снова проверяю URL-адрес с увеличенным значением страницы, в противном случае я уступаю, но это не работает. Есть ли способ более эффективно реализовать paginatio?

паук

 # -*- coding: utf-8 -*-
from pathlib import Path

import scrapy
from scrapy_splash import SplashRequest

BASE_DIR = Path(__file__).resolve().parent.parent

class ChemicalSpider(scrapy.Spider):
    name = 'chemical'
    allowed_domains = ['patents.google.com']
    page_number = 0
    pns = []

    script = '''
        function main(splash, args)
            splash.private_mode_enabled = false
            assert(splash:go(args.url))
            while not splash:select('#resultsContainer') do
                splash:wait(1)
            end
            return splash:html()
        end
    '''

    def start_requests(self):
        with open(BASE_DIR.joinpath('spiders/urls.txt'), "rt") as f:
            start_urls = [url.strip().replace('=', '=') for url in f.readlines()]#Replace = with = in order to work the google search

        for url in start_urls:
            yield SplashRequest(
                url='https://patents.google.com/?q='   url   'amp;num=100', #Add amp;num=100 to display 100 results per page
                callback = self.parse,
                endpoint='execute',
                args={
                    'lua_source': self.script
                }
            )

    def parse(self, response):
        pn = response.xpath('//span[@class="style-scope search-result-item"]/text()').getall()#Scrape the publication numbers
        print('PN')
        print(pn)

        #If length > 0 means that mayne there is another page 
        if len(response.xpath('//div[@id="resultsContainer"]/section[@class="style-scope search-results"]/search-result-item')) != 0:
            self.pns.extend(pn)
            self.page_number = self.page_number   1
            next_page_url = response.url   f'amp;page={self.page_number}amp;num=100'
            print('next_page_url')
            print(next_page_url)

            yield SplashRequest(
                url=next_page_url,
                callback = self.parse,
                endpoint='execute',
                args={
                    'lua_source': self.script
                }
            )
        #if length = 0 means there is not another data, so we yield
        else:
            self.pns.extend(pn)
            yield {
                'url': response.url,
                'pns': self.pns
            }
 

urls.txt

 O=C1C(O)=C(OC2=CC(OC)=CC(OC)=C12)C=3C=CC(OC)=C(OC)C3
O1C(=CCCC1C)C
OC1=CC=C2C3=C1OC4C(O)CCC5(O)C(N(C)CCC345)C2
O1C=C(C=C1C)C
O=C1OC=2C=C(O)C=CC2C(C=3C=CC=CC3)=C1C=4C=CC=CC4
O=C1OC(C(=O)C1=C2OC(CC)CC2)C