Scrapy - 从多个页面中提取数据

chr*_*sHG 5 url scrapy python-3.x

class HomedepotcrawlSpider(scrapy.Spider):
      name = 'homeDepotCrawl'
      allowed_domains = ['homedepot.com']
      start_urls = ['https://www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=0']

def parse(self, response):

    #call home depot function
    for item in self.parseHomeDepot(response):
        yield item

    nextPageSelect = '.hd-pagination__link'
    next_page = response.css(nextPageSelect).getall()
    if next_page:
        yield scrapy.Request(
            response.urljoin(next_page),
            callback=self.parse
        )
Run Code Online (Sandbox Code Playgroud)

编辑-

我获得 .hd-pagination__link 的方式是使用 google chrome 的 CSS 选择器扩展并选择下一页图标(附截图)

下一页的 css 截图

所以我尝试了一些事情,这是对我来说最有意义的方式,我认为我只是为下一页抓取了错误的对象。截至目前,我的程序仅从第一页获取数据,似乎忽略了遍历页面的代码块。

我发现了一个带有 URL 的模式,其中页码以 24 的增量表示(可能是由于项目编号?)。前任:

第 1 页:https : //www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=0

第 2 页:https : //www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=24

第 3 页:https : //www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=48 。. . . . . .

第 n 页:https : //www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=[( n -5 *24) - 24]

等。

当我尝试测试与页码相关的代码[在 Na0 = x 之后增加数字] 时,我只会循环第一页 x 次。(我的输出将是重复 x 次的第一页(24 项)。

我也研究了爬行蜘蛛,但无法真正理解它/实现。

对我的代码/对其他方法的澄清的任何帮助将不胜感激!

这也不是我的整个程序,我保留了我的 parseHomeDepot 函数,因为我认为没有必要,但是如果需要代码,请告诉我!

小智 2

以下是您想要执行的操作的一些工作代码:

\n\n
import scrapy\nfrom urllib.parse import urlsplit, urljoin\n\nclass HomedepotSpider(scrapy.Spider):\n    name = \'homedepot\'\n    start_urls = [\'https://www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=0\']\n\n    def parse(self, response):\n\n        # Here you do something with your items\n\n        next_page = response.css(\'a.hd-pagination__link[title=Next]::attr(href)\').get()\n        if next_page is not None:\n            o = urlsplit(response.url)\n            base_url = f\'{o.scheme}://{o.netloc}\'\n            next_page_url = urljoin(base_url,next_page)\n            yield response.follow(next_page_url, callback=self.parse)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这段代码中要指出的主要内容是:

\n\n
    \n
  1. 检查下一页的选择器。它检查属性标题并仅选择标题为“Next”的元素。即识别分页中的最后一个按钮。I\xc2\xb4m 不确定您的示例是否识别正确的按钮
  2. \n
  3. 您得到的下一页是相对网址。它的作用是使用 urljoin 获取当前 url ( response.url) 的基本部分,然后附加您通过 urljoin 获得的相对值
  4. \n
  5. 一旦你有了下一页的 url,你就可以使用 response.follow 来指示蜘蛛将该 url 与你选择的回调添加到要抓取的 url 列表中
  6. \n
\n\n

这里还有 scrapy 日志,显示它已抓取 31 个页面。如果你执行它,你应该得到这个

\n\n
2020-02-21 10:42:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats:\n{\'downloader/request_bytes\': 44799,\n \'downloader/request_count\': 31,\n \'downloader/request_method_count/GET\': 31,\n \'downloader/response_bytes\': 1875031,\n \'downloader/response_count\': 31,\n \'downloader/response_status_count/200\': 31,\n \'dupefilter/filtered\': 1,\n \'elapsed_time_seconds\': 13.690273,\n \'finish_reason\': \'finished\',\n \'finish_time\': datetime.datetime(2020, 2, 21, 10, 42, 4, 145686),\n \'log_count/DEBUG\': 32,\n \'log_count/INFO\': 10,\n \'memusage/max\': 52195328,\n \'memusage/startup\': 52195328,\n \'request_depth_max\': 31,\n \'response_received_count\': 31,\n \'scheduler/dequeued\': 31,\n \'scheduler/dequeued/memory\': 31,\n \'scheduler/enqueued\': 31,\n \'scheduler/enqueued/memory\': 31,\n \'start_time\': datetime.datetime(2020, 2, 21, 10, 41, 50, 455413)}\n2020-02-21 10:42:04 [scrapy.core.engine] INFO: Spider closed (finished)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望这有帮助!!

\n