Scrapy爬虫框架笔记(三)——实例

根据前两篇笔记,Scrapy爬虫框架笔记(二)。以此运用scrapy框架进行爬虫福布斯富豪榜这个网站。网页如图所示,我们爬取排名、姓名、财富值、财富来源、年龄、城市、行业信息。
Scrapy爬虫框架笔记(三)——实例_第1张图片

创建项目

命令行进入在我们想创建的目录,输入scrapy startproject tutorial即可创建一个tutorial文件夹。然后在spiders文件夹下创建一个dmoz_spider.py文件。

item

依据我们要获取的信息来定义Item

import scrapy

class DmozItem(scrapy.Item):
    index = scrapy.Field()
    name = scrapy.Field()
    money = scrapy.Field()
    company = scrapy.Field()
    age=scrapy.Field()
    city=scrapy.Field()
    major=scrapy.Field()

Spider

在刚刚创建的dmoz_spider.py文件中,进行编写。因为是表格,tr标签里面多个td标签,所以提取内容时用td[i]选取,又因为想要文字,所以后面加上text()。

import scrapy
from tutorial.items import DmozItem

class DmozSpider(scrapy.spiders.Spider):
    name = "dmoz"# 爬虫的唯一标识,不能重复,启动爬虫的时候要用
    allowed_domains = ["forbeschina.com"]# 限定域名,只爬取该域名下的网页
    start_urls = [
        "https://www.forbeschina.com/lists/1728"# 开始爬取的链接
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]  # 获取url,用”/”分段,获去倒数第二个字段
        with open(filename+".txt", 'wb') as f:
            f.write(response.body)

        table=response.xpath("//table")
        tbody=table.xpath(".//tbody")
        tr=tbody.xpath(".//tr")
        for t in tr:
            item = DmozItem()
            item['index']=t.xpath("td[1]/text()").extract()
            item['name']=t.xpath("td[2]/text()").extract()
            item['money']=t.xpath("td[3]/text()").extract()
            item['company']=t.xpath("td[4]/text()").extract()
            item['age']=t.xpath("td[5]/text()").extract()
            item['city']=t.xpath("td[6]/text()").extract()
            item['major']=t.xpath("td[7]/text()").extract()
            yield item

Item Pipeline

储存为json格式和csv格式。

import json
import csv
import codecs

class JsonPipeline(object):
    def __init__(self):
        print("打开文件")
        self.file=codecs.open('dmoz.json','wb',encoding='utf-8')
    def process_item(self,item,spider):
        print("正在写入")
        line=json.dumps(dict(item),ensure_ascii=False)+'\n'
        self.file.write(line)
        return item
    def close_spider(self,spider):
        print("完成,关闭文件")
        self.file.close()

class CsvPipeline(object):
    def __init__(self):
        print("打开文件")
        self.file=codecs.open('dmoz.csv','a',encoding='gb18030')
        self.fieldnames = ["index", "name", "money", "company", "age", "city","major"]
        self.writer = csv.DictWriter(self.file, fieldnames=self.fieldnames)
        self.writer.writeheader()
    def process_item(self,item,spider):
        print("正在写入")
        self.writer.writerow(item)
        return item
    def close_spider(self,spider):
        print("完成,关闭文件")
        self.file.close()

Setting

ITEM_PIPELINES = {
   'tutorial.pipelines.JsonPipeline': 400,
   'tutorial.pipelines.CsvPipeline':500,
}

运行

执行scrapy crawl dmoz即可得到结果。

你可能感兴趣的:(python)