(Scrapy) 生成请求/生成并执行请求/执行请求
(Scrapy) Generate Request / Generate & execute Request / Execute Request
我正在 https://www.accordbox.com/blog/how-crawl-infinite-scrolling-pages-using-python/
学习 scrapy 示例
关于里面的Scrapy解决代码yield Request,我很迷茫
有三个 yield 请求。有时一个Request只是生成,有时生成并执行,有时只是执行。
你能告诉我它们之间有什么区别吗?
谢谢!
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
您可能会发现 figure here 对回答您的问题很有用。
来自 parse_list_page
方法的 yield
正在生成返回 "Engine" 的请求(图中的第 7 步)。 extract_product
中的 yield
退让给 parse_list_page
。 parse_list_page
然后立即将它们返回给引擎。
请注意,extract_product
中的所有代码也可以直接进入 parse_list_page
以创建一个方法。有两种方法可以很好地分离逻辑。
我正在 https://www.accordbox.com/blog/how-crawl-infinite-scrolling-pages-using-python/
学习 scrapy 示例关于里面的Scrapy解决代码yield Request,我很迷茫
有三个 yield 请求。有时一个Request只是生成,有时生成并执行,有时只是执行。
你能告诉我它们之间有什么区别吗?
谢谢!
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
您可能会发现 figure here 对回答您的问题很有用。
来自 parse_list_page
方法的 yield
正在生成返回 "Engine" 的请求(图中的第 7 步)。 extract_product
中的 yield
退让给 parse_list_page
。 parse_list_page
然后立即将它们返回给引擎。
请注意,extract_product
中的所有代码也可以直接进入 parse_list_page
以创建一个方法。有两种方法可以很好地分离逻辑。