目标:使用scrapy抓取豆瓣小组的组名
1. 新建scrapy工程
新建工程文件夹,命令行cd到该目录下,用下面的命令新建一个scrapy工程
scrapy startproject dmoz
新建好的工程目录结构为:
E:\PYTHON WORKSPACE\DOUBAN
│ scrapy.cfg
└─douban
│ items.py
│ pipelines.py
│ settings.py
│ __init__.py
└─spiders
__init__.py
简要说下几个文件,
- items:用来定义要抓取的内容;
- pipelines:用来对内容进行处理,包括过滤、输出等;
- setting:不用说了,配置文件
2. 定义item:
item当然是在items.py
里定义了,我们只抓取小组的名称,因此定义一个groupname
就可以了,很简单
from scrapy.item import Item, Field
class DoubanItem(Item):
groupName = Field()
3. 定义pipeline
这里定义pipeline是将获取到的组名输出到文件,由于默认输出是unicode码,转换为中文需要再处理下。
import codecs
import json
class DoubanPipeline(object):
def __init__(self):
self.file = codecs.open('data.json', 'wb', encoding="utf-8")
def process_item(self, item, spider):
line = json.dumps(dict(item))
self.file.write(line.decode("unicode_escape")+"\r\n")
return item
4. 爬虫内容
这是爬虫的主体了,在spiders文件夹下新建一个python文件“groupSpider.py”,先看内容吧
# coding=utf-8
__author__ = 'Jeffee Chen'
from scrapy.contrib.spiders import CrawlSpider
from douban.items import DoubanItem
class GroupSpider(CrawlSpider):
name = "Douban"
allowed_domains = ["douban.com"]
start_urls = ["http://www.douban.com/group/explore?tag=%E7%A4%BE%E7%A7%91"]
def parse(self, response):
item = DoubanItem()
sel = response.xpath("//div[@class='group-list']/div[@class='result']")
for s in sel:
item["groupName"] = s.xpath("div[@class='content']/div[@class='title']/h3/a/text()").extract()
yield item
这只是一个很简单的爬虫程序,只抓取当前页面,不进行链接追踪,跑一下试试吧:
scrapy crawl Douban
最后一个参数就是我们的spider文件中定义的name,根据pipelines的定义,抓取到的数据被输出到根目录下的data.json文件