原文地址:LoveDev
Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫(xiě)的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。
本系列文章靈感來(lái)自熊能老司機(jī)博客
安裝
安裝過(guò)程請(qǐng)根據(jù)自己使用的平臺(tái)自行 Google,這里是官方的安裝指南
創(chuàng)建項(xiàng)目
本項(xiàng)目用于爬取 豆瓣電影Top250 數(shù)據(jù),開(kāi)發(fā)工具為 PyCharm
項(xiàng)目地址:douban
Scrapy 需要用命令行創(chuàng)建一個(gè)項(xiàng)目:
$ scrapy startproject douban
項(xiàng)目結(jié)構(gòu):

scrapy.cfg:項(xiàng)目配置文件douban/setting.py:爬蟲(chóng)的設(shè)置文件douban/spiders/:爬蟲(chóng)放置文件位置
修改配置文件
需要修改 setting.py 中請(qǐng)求頭信息
chrome 訪問(wèn)豆瓣電影Top250 ,然后打開(kāi)開(kāi)發(fā)者工具并選擇 Network 標(biāo)簽,最后刷新界面:
根據(jù)獲取到的數(shù)據(jù)修改 setting.py 文件:
# 修改下面兩個(gè)字段
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
# Scrapy HTTP Request使用的header
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/event-stream',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,zh-HK;q=0.2',
}
定義數(shù)據(jù)對(duì)象
需要為爬取到的數(shù)據(jù)提供一個(gè)對(duì)象,和 Java 中的對(duì)象類似,繼承于 scrapy.Item 類,定義類型為 scrapy.Field 的屬性字段:
import scrapy
class Item(scrapy.Item):
title = scrapy.Field()
pic = scrapy.Field()
link = scrapy.Field()
score = scrapy.Field()
commentsNum = scrapy.Field()
創(chuàng)建爬蟲(chóng)
scrapy 提供了命令行工具,可以很方便的根據(jù)框架中的模板創(chuàng)建一個(gè)爬蟲(chóng)
# 顯示所有模板
$ scrapy genspider -l
# 查看模板內(nèi)容
$ scrapy genspider -d basic
# 根據(jù)模板生成名為doubanMovie的爬蟲(chóng)文件
$ scrapy genspider -t basic doubanMovie douban.com
生成的 doubanMovie.py 文件:
# -*- coding: utf-8 -*-
import scrapy
class DoubanmovieSpider(scrapy.Spider):
name = "doubanMovie"
allowed_domains = ["douban.com"]
start_urls = ['http://douban.com/']
def parse(self, response):
pass
name:spider 名字,必須是唯一的allowed_domains:允許爬取的域名start_urls:開(kāi)始爬取的 URLparse():spider 的一個(gè)方法,調(diào)用時(shí),會(huì)把start_urls中 URL 下載生成的 Response 對(duì)象作為唯一參數(shù)傳遞給該方法。該方法負(fù)責(zé)解析返回的數(shù)據(jù),提取數(shù)據(jù)和生成需要進(jìn)一步處理的 Request 對(duì)象
修改 start_urls 為我們要爬取的 豆瓣電影Top250 ,并用 XPath 解析 Response 對(duì)象:
# -*- coding: utf-8 -*-
import scrapy
from douban.movie import Movie
import re
class DoubanMovieSpider(scrapy.Spider):
name = "doubanMovie"
allowed_domains = ["douban.com"]
start_urls = [
'https://movie.douban.com/top250',
]
def parse(self, response):
item = Movie()
for sel in response.xpath('//div[@class="item"]'):
item['title'] = sel.xpath('div/a/img/@alt').extract_first()
item['pic'] = sel.xpath('div/a/img/@src').extract_first()
item['link'] = sel.xpath('div/a/@href').extract_first()
item['info'] = sel.xpath('div[2]/div[2]/p[2]/span/text()').extract_first()
item['score'] = sel.xpath('div[2]/div[2]/div/span[2]/text()').extract_first()
item['commentsNum'] = sel.xpath('div[2]/div[2]/div/span[4]/text()').re(r'[0-9]+')[0]
yield item
到此就可以爬取 豆瓣電影Top250 中第一頁(yè)的內(nèi)容了,在命令行中進(jìn)入項(xiàng)目根目錄輸入運(yùn)行命令開(kāi)始爬取內(nèi)容并輸出到文件中:
$ scrapy crawl doubanMovie -o ~/Downloads/doubanMovie.json
doubanMovie.json 文件內(nèi)容:

數(shù)據(jù)流
