#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