使用 scrapy 进行网页抓取的 CSV 输出
CSV output from web scrawling using scrapy
我正在使用 scrapy 将网络爬虫的输出保存在 csv 文件中。爬行本身似乎工作正常,但我对保存在 csv 文件中的输出格式不满意。我抓取了 20 个网页,每个网页包含 100 个职位及其各自的 url。所以我期待输出看起来像这样:
url1, title1
url2, title2
...
...
url1999, title1999
url2000, title2000
然而,csv 中的实际输出如下所示:
url1 url2 ... url100, title1 title2 ... title100
url101 url02 ... url200, title101 title102 ... title200
...
url1901 url902 ... url2000, title1901 title1902 ... title2000
我的蜘蛛代码是:
import scrapy
class TextPostItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
class MySpider(scrapy.Spider):
name = "craig_spider"
allowed_domains = ["craigslist.org"]
start_urls = ["http://sfbay.craigslist.org/search/npo"]
def parse(self, response):
number = 0
for page in range(0, 20):
yield scrapy.Request("http://sfbay.craigslist.org/search/npo?=%s" % number, callback=self.parse_item, dont_filter=True)
number += 100
def parse_item(self, response):
item = TextPostItem()
item['title'] =response.xpath("//span[@class='pl']/a/text()").extract()
item['link'] = response.xpath("//span[@class='pl']/a/@href").extract()
return item
我的 csv 代码是:
scrapy crawl craig_spider -o craig.csv -t csv
有什么建议吗?谢谢
问题是您得到一个包含多个 //span[@class='pl']/a/
字段的响应,将每个 text()
加载到列表中并将其分配给 item['title']
,然后加载每个 [=16] =] 到列表中并将其分配给 item['link']
.
换句话说,对于第一个响应,您实际上是在执行以下操作:
item['title'] = [title1, title2, ..., title100]
item['link'] = [url1, url2, ..., url100]
因此,将其发送到 CSV 为:
title,link
[title1, title2, ..., title100],[url1, url2, ..., url100]
要解决此问题,请遍历每个 //span[@class='pl']/a/
并为每个设置单独的项目。
def parse_item(self, response):
for span in response.xpath("//span[@class='pl']/a"):
item = TextPostItem()
item['title'] = span.xpath(".//text()").extract()
item['link'] = span.xpath(".//@href").extract()
yield item
我正在使用 scrapy 将网络爬虫的输出保存在 csv 文件中。爬行本身似乎工作正常,但我对保存在 csv 文件中的输出格式不满意。我抓取了 20 个网页,每个网页包含 100 个职位及其各自的 url。所以我期待输出看起来像这样:
url1, title1
url2, title2
...
...
url1999, title1999
url2000, title2000
然而,csv 中的实际输出如下所示:
url1 url2 ... url100, title1 title2 ... title100
url101 url02 ... url200, title101 title102 ... title200
...
url1901 url902 ... url2000, title1901 title1902 ... title2000
我的蜘蛛代码是:
import scrapy
class TextPostItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
class MySpider(scrapy.Spider):
name = "craig_spider"
allowed_domains = ["craigslist.org"]
start_urls = ["http://sfbay.craigslist.org/search/npo"]
def parse(self, response):
number = 0
for page in range(0, 20):
yield scrapy.Request("http://sfbay.craigslist.org/search/npo?=%s" % number, callback=self.parse_item, dont_filter=True)
number += 100
def parse_item(self, response):
item = TextPostItem()
item['title'] =response.xpath("//span[@class='pl']/a/text()").extract()
item['link'] = response.xpath("//span[@class='pl']/a/@href").extract()
return item
我的 csv 代码是:
scrapy crawl craig_spider -o craig.csv -t csv
有什么建议吗?谢谢
问题是您得到一个包含多个 //span[@class='pl']/a/
字段的响应,将每个 text()
加载到列表中并将其分配给 item['title']
,然后加载每个 [=16] =] 到列表中并将其分配给 item['link']
.
换句话说,对于第一个响应,您实际上是在执行以下操作:
item['title'] = [title1, title2, ..., title100]
item['link'] = [url1, url2, ..., url100]
因此,将其发送到 CSV 为:
title,link
[title1, title2, ..., title100],[url1, url2, ..., url100]
要解决此问题,请遍历每个 //span[@class='pl']/a/
并为每个设置单独的项目。
def parse_item(self, response):
for span in response.xpath("//span[@class='pl']/a"):
item = TextPostItem()
item['title'] = span.xpath(".//text()").extract()
item['link'] = span.xpath(".//@href").extract()
yield item