我正在用Scrapy开发一个通用的Web搜寻器。但是某些网站是通过javascript翻页的,我需要添加一个硒中间件来对其进行分页并获取所有详细的URL。
一些问题困扰着我,硒中间件总是返回Htmlresponse到parse的功能来解析细节。但是现在我没有收到详细网址,只是一个详细网址列表的html内容。我应该如何在中间件中返回?可以获取所有详细内容并正确发送到Spider中的解析功能。我尝试使用yield Request,但是它不起作用。
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()
如果你们有更有效的方法,请告诉我。我的英语不好,某些细节可能无法清楚描述。请原谅我。