我正在https://www.accordbox.com/blog/how-crawl-infinite-scrolling-pages-using-python/
上研究一些令人毛骨悚然的例子对于其中的Scrapy解决方案代码的产量请求,我感到很困惑。
有三个产量请求。有时会生成请求,有时会生成并执行它,有时会执行。
请问我它们之间有什么区别?
谢谢!。
def parse_list_page(self, response):
next_link = response.xpath(
"//a[@class='page-link next-page']/@href").extract_first()
if next_link:
url = response.url
next_link = url[:url.find('?')] + next_link
################################
# Generate and Execute Request
################################
yield Request(
url=next_link,
callback=self.parse_list_page
)
for req in self.extract_product(response):
################################
#Just Execute Request
################################
yield req
def extract_product(self, response):
links = response.xpath("//div[@class='col-lg-8']//div[@class='card']/a/@href").extract()
for url in links:
result = parse.urlparse(response.url)
base_url = parse.urlunparse(
(result.scheme, result.netloc, "", "", "", "")
)
url = parse.urljoin(base_url, url)
################################
#Just Generate Request
################################
yield Request (
url=url,
callback=self.parse_product_page
)
def parse_product_page(self, response):
logging.info("processing " + response.url)
yield None
答案 0 :(得分:0)
您可能会发现figure here对回答问题很有用。
来自yield
方法的parse_list_page
正在将请求产生回“引擎”(图中的步骤7)。 yield
中的extract_product
正在退回到parse_list_page
。 parse_list_page
然后立即将它们放回引擎。
请注意,extract_product
中的所有代码也可以直接进入parse_list_page
以形成一个方法。拥有两种方法可以很好地分离逻辑。
答案 1 :(得分:0)
谢谢你,汤姆。我可以更好地理解它。 我知道有Scheduler,并且可能会有延迟。
但是,当我通过 yield req 代码时,该过程完成了,而没有执行请求。
for req in self.extract_product(response):
#yield req
pass
为什么调度程序直到整个过程完成才执行接收到的请求?