Python、Scrapy、多个项目和链接

问题描述 投票:0回答:1

我正在学习网络抓取并做一些个人项目来开始。我已经能够学习一些基础知识,但在将抓取的数据保存到 csv 文件时遇到问题。

import scrapy


class ImdbHmSpider(scrapy.Spider):
    name = "imdb_hm"
    allowed_domains = ["www.imdb.com/"]
    start_urls = ["https://www.imdb.com/list/ls069761801/"]

    def parse(self, response):
        title = response.xpath('//div[@class="lister-list"]')

        for titles in title:
            title_name = titles.xpath("./div/div/h3/a/text()").get()


        yield {'title_name':title_name,}

当我运行这个时,我只得到第一个项目“Harvest Moon”。如果我将 title_name 行结尾更改为 .getall(),我确实会将它们全部显示在终端窗口中,但在 CSV 文件中,它们都会一起运行。

excel file showing the titles in one cell.

在终端窗口中,我正在运行: scrapycrawl imdb_hm -O imdb.csv

任何帮助将非常感激。

我已经获得了代码示例,这些代码示例将抓取多个项目并将它们放入每行的 csv 文件中。然后我用我试图抓取的网站替换了示例代码,但没有得到相同的结果。

我期待每行都有一个包含所有电影标题的 csv 文件。

python csv scrapy
1个回答
0
投票

您的问题是您正在尝试迭代长度为 1 的序列。这可以通过您所描述的行为来确定,也可以通过简单地查看页面的 html 并看到只有一个带有 的

div
元素来确定
lister-list
类。

为了迭代所有标题,您需要使用一个选择器,通过将其指向您要提取的每个项目出现一次的元素来单独捕获所有元素。在您的情况下,您可以选择

lister-list
的子级或包含类
lister-item
的元素。

您的第二个错误是,您等到完成迭代序列才能

yield
结果。通过这样做,您可以保证此回调方法只会在您的 csv 文件中生成一行。

此问题的解决方案是在 for 循环中使用

yield
,以便为每个提取的标题生成一行。

例如:

import scrapy

class ImdbHmSpider(scrapy.Spider):
    name = "imdb_hm"
    allowed_domains = ["www.imdb.com/"]
    start_urls = ["https://www.imdb.com/list/ls069761801/"]

    def parse(self, response):
        for title in response.css('.lister-item'):
            title_name = title.xpath(".//h3/a/text()").get()
            yield {'title_name': title_name}
© www.soinside.com 2019 - 2024. All rights reserved.