背景:我只是一个网络抓取新手。我试着抓取一个本地的电子商务网站。这是一个动态的网站,所以我使用scrapy-playwright(chromium)
代理。
问题:在我试着抓取多个页面之前,它一直运行得很顺利。我使用了多个带有单独页码的URL。但是我没有抓取不同的页面,第一页刮了好几次,好像是剧作家的错,不知道是代码错误还是Bug,我试过不同的流程,结果都一样,有没有代理,有没有用户-探员。而且不知道为什么会这样......
import logging
import scrapy
from scrapy_playwright.page import PageMethod
from helper import should_abort_request
class ABCSpider(scrapy.Spider):
name = "ABC"
custom_settings = {
'PLAYWRIGHT_DEFAULT_NAVIGATION_TIMEOUT': '100000',
'PLAYWRIGHT_ABORT_REQUEST': should_abort_request
}
def start_requests(self):
yield scrapy.Request(
url='https://www.daraz.com.bd/xbox-games/?spm=a2a0e.searchlistcategory.cate_6_6.5.2a4e15ab6961xO&page=1',
meta={
"playwright": True,
"playwright_include_page": True,
"playwright_page_methods": [
PageMethod("wait_for_selector", '[class="box--LNmE6"]'),
],
},
)
async def parse(self, response):
total= response.xpath('/html/body/div[3]/div/div[2]/div/div/div[1]/div[3]/div/ul/li[last()-1]/a/text()').extract()[0]
total_pages = int(total) #total_pages = 4
links = []
for i in range(1, total_pages+1):
a = 'https://www.daraz.com.bd/xbox-games/?spm=a2a0e.searchlistcategory.cate_6_6.5.2a4e15ab6961xO&page={}'.format(i)
links.append(a)
for link in links:
res = scrapy.Request(url=link, meta={
"playwright": True,
"playwright_include_page": True,
"playwright_page_methods": [
PageMethod("wait_for_selector",
'[class="box--ujueT"]'),
]})
yield res and {
"link" : response.url
}
输出:
[
{"link": "https://www.daraz.com.bd/xbox-games/?spm=a2a0e.searchlistcategory.cate_6_6.5.2a4e15ab6961xO&page=1"},
{"link": "https://www.daraz.com.bd/xbox-games/?spm=a2a0e.searchlistcategory.cate_6_6.5.2a4e15ab6961xO&page=1"},
{"link": "https://www.daraz.com.bd/xbox-games/?spm=a2a0e.searchlistcategory.cate_6_6.5.2a4e15ab6961xO&page=1"},
{"link": "https://www.daraz.com.bd/xbox-games/?spm=a2a0e.searchlistcategory.cate_6_6.5.2a4e15ab6961xO&page=1"}
]
1条答案
按热度按时间z8dt9xmd1#
您不是在
start_requests
方法中迭代页面,而是尝试在parse
方法中提取一些页面,并从那里生成更多请求。此策略的问题在于,您在
parse
方法中生成的每个请求本身都由parse方法解析,因此,对于每个请求,您都告诉它为从页码中检测到的每个页面生成一整套新请求,因为每个页面上的页码可能都相同。幸运的是,scrapy内置了一个重复过滤器,所以如果你正确地生成它们,它很可能会忽略这些重复。
下一个问题是yield语句。表达式
a and b
不返回a
和b
,它只返回b
。也就是说,除非a
是falsy,否则它将返回a
。所以你的屈服表达式...
实际上只会是
yield
:x1米10英寸1x.除了上面提到的,您的代码没有做任何其他事情,但是,我假设既然您指示页面等待每个待售物品的元素呈现,那么您的最终目标是从页面上的每个物品中提取数据。
因此,考虑到这一点,我建议你甚至不要使用scrapy_playwright,而是从json api获取数据,网站在ajax请求中使用这些数据。
例如:
部分输出: