Я занимаюсь разработкой универсального поискового робота с помощью Scrapy.Но некоторые страницы веб-сайтов переворачиваются на javascript, мне нужно добавить промежуточное программное обеспечение для селена на страницу и получить все детали URL.
Некоторая проблема беспокоит меня в том, что промежуточное программное обеспечение селен всегда возвращает Htmlresponse для функции синтаксического анализа, чтобы разобрать детали. Но теперь я получаю URL-адрес детали, который не запрашивается, только html-содержимое подробного списка URL-адресов. Как мне вернуться в промежуточное ПО? могу получить весь подробный контент и правильно отправить в функцию разбора в Spider.Я пытаюсь использовать yield yield, но он не работает.
class SeleniumMiddleware(object):
def process_request(self, request, spider):
if spider.selenium :
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=chrome_options)
browser = browser.get(request.url)
wait = WebDriverWait(browser, 10)
urls = []
max_page = 1
try:
for i in range(max_page):
href = browser.find_element_by_class_name('zsy_tb').find_elements_by_tag_name('a')
next_page = wait.until(EC.presence_of_element_located((By.LINK_TEXT, 'next')))
for a in href:
urls.append(a.get_attribute('href'))
next_page.click()
for i in urls:
yield Request(a.get_attribute('href'), callback=spider.parse_item)
# return HtmlResponse(url=request.url, body=browser.page_source, request=request, encoding='utf-8', status=200)
except:
pass
def parse_item(self, response,PID=None):
item = self.config.get('item')
if item:
cls = eval(item.get('class'))()
loader = eval(item.get('loader'))(cls, response=response)
for key, value in item.get('attrs').items():
for extractor in value:
if extractor.get('method') == 'xpath':
loader.add_xpath(key, extractor.get('args'), **{'re': extractor.get('re')})
if extractor.get('method') == 'css':
loader.add_css(key, extractor.get('args'), **{'re': extractor.get('re')})
if extractor.get('method') == 'value':
loader.add_value(key, *extractor.get('args'), **{'re': extractor.get('re')})
if extractor.get('method') == 'attr':
loader.add_value(key, eval(*extractor.get('args')))
yield loader.load_item()
Если вы, ребята, имеете более эффективный метод, должны сказать мне. Мой английский не очень хорошо, некоторые детали могут быть не описаны четко. Пожалуйста, прости меня.