用Scrapy从碎片数据中提取 Dataframe

jtjikinw  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(162)

我想用Scrapy创建一个包含三列的数据框;标题,链接和日期.这是我的代码:

class LaquotidienneSpider(scrapy.Spider):
    name = 'laquotidienne'

    start_urls = ['http://laquotidienne.ma/']

    def parse(self, response):
        for articles in response.css('div.list_article_detail'):
            items=[]
            item={
                "title":articles.css('a::text').get().replace('\n',' ').strip(),
                "link":"https://laquotidienne.ma/articles/economie",
                "date":articles.css('span::text').get()
            }

        for i in range(2,501):
            next_page="https://laquotidienne.ma/articles/economie/"+str(i)
            yield response.follow(next_page, callback=self.parse)

            items.append(item)

        df = pd.DataFrame(items, columns=['title', 'link', 'date'])

但不幸的是它不工作,我得到:

name 'df' is not defined

任何帮助都是感激不尽的。

blpfk2vs

blpfk2vs1#

问题是 * 每一页 * 你都要重复以下内容

  • 创建一个名为“项目”的新列表--实际上,您会对每一个废弃的项目执行此操作--
  • 解压缩项目
  • 从第2页到最后一页执行请求,注意:每次你解析一个新页面时你都这样做,尽管Scrapy只访问第1页,但你仍然不应该这样做
  • 定义新 Dataframe
    我的程式码做什么
  • 仅从代码顶部开始请求一次
  • 分别解析每个页面
  • 提取元素并将其附加到全局列表items
  • 在蜘蛛完成并关闭后closed开始运行
  • 将全局列表读入 Dataframe
  • 做任何你想要的操作,在我的情况下,我保存了输出在csv
    如何运行代码
  • $ scrapy startproject stack_code
  • $ cd ./stack_code
  • $ scrapy genspider laquotidienne "http://laquotidienne.ma/"
  • stack_code/stack_code/spiders/laquotidienne.py中编写以下代码
  • $ scrapy crawl laquotidienne
    代码
import scrapy
import pandas as pd

# the global list

items = []

class LaquotidienneSpider(scrapy.Spider):
    name = 'laquotidienne'

    def start_requests(self):
        '''The right Method to start the requests'''

        for i in range(1, 10):
            next_page="https://laquotidienne.ma/articles/economie/"+str(i)
            yield scrapy.Request(next_page, callback=self.parse)

    def parse(self, response):
        '''Method to parse each page'''

        for articles in response.css('div.list_article_detail'):
            # extract the item
            item = {
                "title":articles.css('a::text').get().replace('\n',' ').strip(),
                "link":"https://laquotidienne.ma/articles/economie",
                "date":articles.css('span::text').get(),
            }

            # add the item to the global list
            items.append(item)

    def closed(self, reason):
        '''Method to be called after the spider finishes'''

        # create datafrane from the global list 'items'
        df = pd.DataFrame(items, columns=['title', 'link', 'date'])

        # do whatefer operations you want
        df.to_csv('Test.csv', index=False)

相关问题