【发布时间】:2021-04-03 09:03:39
【问题描述】:
我正在尝试使用 scrapy 与 selenium 结合使用从网站的内页中抓取不同帖子的标题,尽管该网站的内容是静态的。该脚本从登录页面抓取不同帖子的链接,并重用新解析的链接从其内页获取标题。
我知道有一个library 用于在scrapy 中使用硒。但是,我对在这个基本用例中使用该库不感兴趣。
以下蜘蛛中有两种方法。我可以坚持使用一种方法来完成整个工作,但我在这里使用了两种方法来了解如何将链接从一种方法传递到另一种方法,以便在不发出任何请求的情况下在后一种方法中完成其余的事情,如 @ 987654322@.
脚本似乎工作正常。如果我从这里yield self.parse_from_innerpage(response.urljoin(elem)) 踢出yield 并像self.parse_from_innerpage(response.urljoin(elem)) 一样使用,该脚本也可以正常工作。
问题:我应该在 parse 方法中使用 yield 还是不使用当前实现,因为它们都可以互换工作?
我试过了:
import scrapy
from selenium import webdriver
from scrapy.crawler import CrawlerProcess
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class StackoverflowSpider(scrapy.Spider):
name = "stackoverflow"
start_urls = ['https://stackoverflow.com/questions/tagged/web-scraping']
def __init__(self):
self.driver = webdriver.Chrome()
self.wait = WebDriverWait(self.driver,15)
def parse(self, response):
for elem in response.css(".summary .question-hyperlink::attr(href)").getall():
yield self.parse_from_innerpage(response.urljoin(elem))
def parse_from_innerpage(self,link):
self.driver.get(link)
elem = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "h1[itemprop='name'] > a")))
print(elem.text)
if __name__ == "__main__":
c = CrawlerProcess({
'USER_AGENT':'Mozilla/5.0',
'LOG_LEVEL':'ERROR',
})
c.crawl(StackoverflowSpider)
c.start()
【问题讨论】:
-
您的
parse_from_innerpage方法不返回任何内容(意味着它返回 None)。这可能会导致生成器返回许多 None 对象。不使用打印,而是返回 elem.text
标签: python python-3.x selenium web-scraping scrapy