Python、Scrapy、多个项目和链接

2w3kk1z5  于 11个月前  发布在  Python
关注(0)|答案(1)|浏览(119)

我正在学习网页抓取和做一些个人项目,我已经能够学习一些基本知识,但在将抓取的数据保存到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.
在终端窗口中,我正在运行:scrappy crawl imdb_hm -O imdb.csv
任何帮助都将不胜感激。
我已经得到了代码的样本,将刮多个项目,并把它们放在一个CSV文件的每一行。然后我取代了样本代码与网站,我试图刮,并没有得到相同的结果。
我希望有一个CSV文件的所有电影标题在每一行。

xam8gpfp

xam8gpfp1#

你的问题是,你正在尝试创建一个长度为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}

字符串

相关问题