【问题标题】:Error when using a csv file with URLs in scrapy python在scrapy python中使用带有URL的csv文件时出错
【发布时间】:2020-11-10 01:08:12
【问题描述】:

我有多个要抓取的 URL 存储在一个 csv 文件中,其中每一行都是一个单独的 URL,我正在使用此代码来运行它

     def start\\_requests(self): 

             with open('csvfile', 'rb') as f: 

                      list=[] 

                      for line in f.readlines(): 

                             array = line.split(',')

                             url = array[9] 

                             list.append(url) 

                    list.pop(0)
             for url in list:
                    if url != "": 

                          yield scrapy.Request(url=url, callback=self.parse) 

它给了我以下错误IndexError: list index out of range,任何人都可以帮我纠正这个错误或建议另一种使用该 csv 文件的方法吗?

编辑: csv 文件如下所示:

http://example.org/page1
http://example.org/page2

有 9 行这样的行

【问题讨论】:

  • 能否分享一些您的 csv 文件以帮助找出问题所在。 IndexError: list index out of range 很可能表明原因可能是由于url = array[9]
  • 它实际上是一个csv文件,其中每一行都是一个URL,没有额外的符号,没有分隔符,什么都没有,有9行用于测试目的
  • 编辑问题以显示 csv 文件

标签: python web-scraping scrapy


【解决方案1】:

您应该能够通过将 csv 文件读入列表变量来完成此操作,而无需执行上述某些代码。因此不需要splitpopappend

工作示例

import csv
import scrapy
from scrapy.crawler import CrawlerProcess


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        with open('websites.csv') as csv_file:
            data = csv.reader(csv_file)
            for row in data:
                # Supposing that the data is in the first column
                url = row[0]
                if url != "":
                    # We need to check this has the http prefix or we get a Missing scheme error
                    if not url.startswith('http://') and not url.startswith('https://'):
                        url = 'https://' + url
                    yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # Do my data extraction
        print("test")


if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    })
    c.crawl(QuotesSpider)
    c.start()

【讨论】:

  • 它几乎可以完美运行,因为所有的 url 都以 https 开头,所以它把它们变成了 https:// http// example .com/site1 (没有空格),但是在去掉了部分前缀之后检查它工作正常,谢谢
  • 你是对的,我的前缀检查应该是and。我现在会更新它。无论如何,很高兴它成功了
  • 如果对您没有不便,您介意解释一下或将我指向一个来源并解释为什么最后一部分是必要的吗?如果 name 部分
  • 该部分仅用于将蜘蛛作为单个 python 脚本运行,而不是通过scrapy crawl 命令。它在文档中提到:docs.scrapy.org/en/latest/topics/…if __name__ == "__main__" 部分是一般的python。你可以在这里找到解释:stackoverflow.com/questions/28336627/if-name-main-python
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多