python爬蟲框架Scrapy

爬蟲框架Scrapy(三)

使用框架Scrapy開發(fā)一個(gè)爬蟲只需要四步:
創(chuàng)建項(xiàng)目:scrapy startproject proname(項(xiàng)目名字乡数,不區(qū)分大小寫)
明確目標(biāo)(編寫items.py):明確你想要抓取的目標(biāo)
制作爬蟲(spiders/xxspider.py):制作爬蟲開始爬取網(wǎng)頁
存儲(chǔ)內(nèi)容(pipelines.py):設(shè)計(jì)管道存儲(chǔ)爬取內(nèi)容

1、新建項(xiàng)目

在開始爬取之前贯溅,必須創(chuàng)建一個(gè)新的Scrapy項(xiàng)目冠胯。進(jìn)入自定義的項(xiàng)目目錄中火诸,運(yùn)行下列命令:

scrapy startproject spiderProject

生成項(xiàng)目scrapy_1,目錄如下:

spiderProject/
   spiderProject1/
        spiders/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
    scrapy.cfg

這些文件分別是:
scrapy.cfg: 項(xiàng)目的配置文件。
spiderProject/: 項(xiàng)目的Python模塊荠察,將會(huì)從這里引用代碼置蜀。
spiderProject/items.py: 項(xiàng)目的目標(biāo)文件奈搜。
spiderProject/pipelines.py: 項(xiàng)目的管道文件。
spiderProject/settings.py: 項(xiàng)目的設(shè)置文件盯荤。
spiderProject/spiders/: 存儲(chǔ)爬蟲代碼目錄馋吗。

2、明確目標(biāo)

抓取豆瓣電影TOP250網(wǎng)站所有的電影以及評分https://movie.douban.com/top250秋秤。
再項(xiàng)目的目標(biāo)文件創(chuàng)建宏粤,制作一個(gè)Item容器。
Item容器是存儲(chǔ)爬取數(shù)據(jù)的容器灼卢,使用方式類似于python字典Dict绍哎,我們需要對爬取的數(shù)據(jù)分析,定義爬取記錄的數(shù)據(jù)結(jié)構(gòu)鞋真,然后建立相應(yīng)的字段崇堰。
在spiderProject/items.py文件添加:

import scrapy

# 爬取豆瓣電影以及評分
class SpiderprojectItem(scrapy.Item):
    name = scrapy.Field()
    score = scrapy.Field()

3、制作爬蟲

3.1涩咖、創(chuàng)建爬蟲douban

在當(dāng)前目錄下輸入命令:

scrapy genspider douban "douban.cn"

創(chuàng)建一個(gè)名為douban的爬蟲海诲,將在scrapy_1/spiders目錄下生成一個(gè)douban.py文件,并指定爬取域的范圍檩互。

import scrapy

class DooubanSpider(scrapy.Spider):
    name = 'doouban'
    allowed_domains = ['doouban.cn']
    start_urls = ['http://doouban.cn/']

    def parse(self, response):
        pass

3.2饿肺、確立屬性方法

要實(shí)現(xiàn)一個(gè)Spider爬蟲, 必須有一個(gè)繼承scrapy.Spider類的子類盾似,并確定了三個(gè)強(qiáng)制的屬性 和 一個(gè)方法敬辣。

name屬性

name = "" :這個(gè)爬蟲的識別名稱,必須是唯一的零院,在不同的爬蟲必須定義不同的名字溉跃。

allow_domains屬性

allow_domains = [] 是搜索的域名范圍,也就是爬蟲的約束區(qū)域告抄,規(guī)定爬蟲只爬取這個(gè)域名下的網(wǎng)頁撰茎,不存在的URL會(huì)被忽略。

start_urls屬性

start_urls = () :爬取的URL元祖/列表打洼。爬蟲從這里開始抓取數(shù)據(jù)龄糊,所以,第一次下載的數(shù)據(jù)將會(huì)從這些urls開始募疮。其他子URL將會(huì)從這些起始URL中繼承性生成炫惩。

parse方法

parse(self, response) :解析的方法,每個(gè)初始URL完成下載后將被調(diào)用阿浓,調(diào)用的時(shí)候傳入從每一個(gè)URL傳回的Response對象來作為唯一參數(shù)他嚷,主要作用如下:
1、負(fù)責(zé)解析返回的網(wǎng)頁數(shù)據(jù)(response.body),提取結(jié)構(gòu)化數(shù)據(jù)(生成item)筋蓖;
2卸耘、生成需要下一頁的URL請求;

3.3粘咖、配置文件

如果執(zhí)行爬蟲過程中蚣抗,出現(xiàn)403錯(cuò)誤:

HTTP status code is not handled or not a llowed

我們需要將自身偽裝成瀏覽器請求
修改配置文件settings.py,添加如下(添加任意一個(gè)均可以):

import random
# 需要設(shè)置USER_AGENT,假裝自己是瀏覽器訪問網(wǎng)頁
user_agent_list = [
 "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
 "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
 "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
 "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
 "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
 "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
 ]
USER_AGENT = random.choice(user_agent_list)

3.4、配置爬蟲文件

爬取需要的數(shù)據(jù)瓮下,形成json文件

from spiderProject.items import SpiderprojectItem


class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['douban.cn']
    start_urls = ['http://movie.douban.com/top250']

    def parse(self, response):

        for item in response.css('.item'):
            movie = SpiderprojectItem()
            title = item.css('.hd span.title::text').extract_first()
            star = item.css('.star span.rating_num::text').extract_first()
            movie['name'] = title
            movie['score'] = star
            yield movie
        # 獲取下一頁url
        # next_url = response.css('span.next a::attr("href")').extract_first()
        # if next_url is not None:
        #     url = self.start_urls[0]+next_url
        #     yield scrapy.Request(url=url,callback=self.parse())

4翰铡、設(shè)計(jì)管道,存儲(chǔ)數(shù)據(jù)

import json
# 管道文件 用來處理Items
class SpiderprojectPipeline:
    def __init__(self):
        # 使用二進(jìn)制寫入模式(‘wb’)來開啟待操作文件唱捣,
        # 而不能像原來那樣,采用字符寫入模式(‘w’)
        self.f = open('movies.json', 'wb')

    def process_item(self, item, spider):
        content = json.dumps(dict(item),ensure_ascii=False) + ',\n'
        self.f.write(content.encode('utf-8'))
        return item

    def close_spider(self, spider):
        self.f.close()

同時(shí)需要在settings文件下打開管道文件配置(只需要解開注釋就可以了)网梢。

# 啟用管道
# 優(yōu)先級 現(xiàn)在是300 范圍 0-1000 越小 優(yōu)先級越高
ITEM_PIPELINES = {
   'spiderProject.pipelines.SpiderprojectPipeline': 300,
}

5震缭、運(yùn)行爬蟲

scrapy crawl douban

運(yùn)行項(xiàng)目并查看生成的json文件。

{"name": "肖申克的救贖", "score": "9.7"},
{"name": "霸王別姬", "score": "9.6"},
{"name": "阿甘正傳", "score": "9.5"},
{"name": "這個(gè)殺手不太冷", "score": "9.4"},
{"name": "泰坦尼克號", "score": "9.4"},
{"name": "美麗人生", "score": "9.5"},
{"name": "千與千尋", "score": "9.4"},
{"name": "辛德勒的名單", "score": "9.5"},
......
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末战虏,一起剝皮案震驚了整個(gè)濱河市拣宰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烦感,老刑警劉巖巡社,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異手趣,居然都是意外死亡晌该,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門绿渣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朝群,“玉大人,你說我怎么就攤上這事中符〗郑” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵淀散,是天一觀的道長右莱。 經(jīng)常有香客問我,道長档插,這世上最難降的妖魔是什么慢蜓? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮郭膛,結(jié)果婚禮上胀瞪,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好凄诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布圆雁。 她就那樣靜靜地躺著,像睡著了一般帆谍。 火紅的嫁衣襯著肌膚如雪伪朽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天汛蝙,我揣著相機(jī)與錄音烈涮,去河邊找鬼。 笑死窖剑,一個(gè)胖子當(dāng)著我的面吹牛坚洽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播西土,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼讶舰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了需了?” 一聲冷哼從身側(cè)響起跳昼,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肋乍,沒想到半個(gè)月后鹅颊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓造,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年堪伍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觅闽。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杠娱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谱煤,到底是詐尸還是另有隱情摊求,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布刘离,位于F島的核電站室叉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏硫惕。R本人自食惡果不足惜茧痕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恼除。 院中可真熱鬧踪旷,春花似錦曼氛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至气破,卻和暖如春聊浅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背现使。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工低匙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碳锈。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓顽冶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親售碳。 傳聞我的和親對象是個(gè)殘疾皇子强重,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容