根据前两篇笔记,Scrapy爬虫框架笔记(二)。以此运用scrapy框架进行爬虫福布斯富豪榜这个网站。网页如图所示,我们爬取排名、姓名、财富值、财富来源、年龄、城市、行业信息。
命令行进入在我们想创建的目录,输入scrapy startproject tutorial
即可创建一个tutorial文件夹。然后在spiders文件夹下创建一个dmoz_spider.py文件。
依据我们要获取的信息来定义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()
在刚刚创建的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
储存为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()
ITEM_PIPELINES = {
'tutorial.pipelines.JsonPipeline': 400,
'tutorial.pipelines.CsvPipeline':500,
}
执行scrapy crawl dmoz
即可得到结果。