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)頁(yè)
存儲(chǔ)內(nèi)容(pipelines.py):設(shè)計(jì)管道存儲(chǔ)爬取內(nèi)容秒咐,存入數(shù)據(jù)庫(kù)

1风瘦、創(chuàng)建項(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)站所有的電影以及評(píng)分https://movie.douban.com/top250芒篷。
再項(xiàng)目的目標(biāo)文件創(chuàng)建搜变,制作一個(gè)Item容器。
Item容器是存儲(chǔ)爬取數(shù)據(jù)的容器针炉,使用方式類似于python字典Dict挠他,我們需要對(duì)爬取的數(shù)據(jù)分析,定義爬取記錄的數(shù)據(jù)結(jié)構(gòu)篡帕,然后建立相應(yīng)的字段殖侵。
在spiderProject/items.py文件添加:

import scrapy

# 爬取豆瓣電影以及評(píng)分
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è)爬蟲的識(shí)別名稱,必須是唯一的献幔,在不同的爬蟲必須定義不同的名字懂傀。

allow_domains屬性

allow_domains = [] 是搜索的域名范圍,也就是爬蟲的約束區(qū)域蜡感,規(guī)定爬蟲只爬取這個(gè)域名下的網(wǎng)頁(yè)蹬蚁,不存在的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對(duì)象來作為唯一參數(shù)球榆,主要作用如下:
1、負(fù)責(zé)解析返回的網(wǎng)頁(yè)數(shù)據(jù)(response.body)禁筏,提取結(jié)構(gòu)化數(shù)據(jù)(生成item)持钉;
2、生成需要下一頁(yè)的URL請(qǐng)求篱昔;

3.3每强、配置文件

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

HTTP status code is not handled or not a llowed

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

import random
# 需要設(shè)置USER_AGENT,假裝自己是瀏覽器訪問網(wǎng)頁(yè)
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)

同時(shí)settings文件加入mongoDB的配置信息

# MONGODB 主機(jī)名
MONGODB_HOST = "127.0.0.1"
# MONGODB 端口號(hào)
MONGODB_PORT = 27017
# 數(shù)據(jù)庫(kù)名稱
MONGODB_DBNAME = "Douban"
# 存放數(shù)據(jù)的表名稱
MONGODB_SHEETNAME = "doubanmovies"

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
        # 獲取下一頁(yè)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ù)mongoDB

# 存入mongoDB數(shù)據(jù)庫(kù)
import pymongo
from spiderProject.settings import MONGODB_HOST
from spiderProject.settings import MONGODB_PORT
from spiderProject.settings import MONGODB_DBNAME
from spiderProject.settings import MONGODB_SHEETNAME

class SpiderprojectPipeline:
    def __init__(self):
        host = MONGODB_HOST
        port = MONGODB_PORT
        dbname = MONGODB_DBNAME
        tablename = MONGODB_SHEETNAME
        # 創(chuàng)建數(shù)據(jù)庫(kù)連接
        self.client = pymongo.MongoClient(
            host=host,
            port=port
        )
        # 指定數(shù)據(jù)庫(kù)
        mydb=self.client[dbname]
        # 指定數(shù)據(jù)表
        self.dbtable = mydb[tablename]

    def process_item(self, item, spider):
        # 將數(shù)據(jù)存入數(shù)據(jù)表
        data = dict[item]
        self.dbtable.insert(data)
        return item

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

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

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

5奶栖、運(yùn)行爬蟲

scrapy crawl douban

6、查看存入mongoDB的數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末门坷,一起剝皮案震驚了整個(gè)濱河市宣鄙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌默蚌,老刑警劉巖冻晤,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異敏簿,居然都是意外死亡明也,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惯裕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來温数,“玉大人,你說我怎么就攤上這事蜻势〕糯蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵握玛,是天一觀的道長(zhǎng)够傍。 經(jīng)常有香客問我,道長(zhǎng)挠铲,這世上最難降的妖魔是什么冕屯? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拂苹,結(jié)果婚禮上安聘,老公的妹妹穿的比我還像新娘。我一直安慰自己瓢棒,他們只是感情好浴韭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脯宿,像睡著了一般念颈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上连霉,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天榴芳,我揣著相機(jī)與錄音嗡靡,去河邊找鬼。 笑死翠语,一個(gè)胖子當(dāng)著我的面吹牛叽躯,可吹牛的內(nèi)容都是我干的财边。 我是一名探鬼主播肌括,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酣难!你這毒婦竟也來了谍夭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤憨募,失蹤者是張志新(化名)和其女友劉穎紧索,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菜谣,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珠漂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尾膊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳危。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冈敛,靈堂內(nèi)的尸體忽然破棺而出待笑,到底是詐尸還是另有隱情,我是刑警寧澤抓谴,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布暮蹂,位于F島的核電站,受9級(jí)特大地震影響癌压,放射性物質(zhì)發(fā)生泄漏仰泻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一滩届、第九天 我趴在偏房一處隱蔽的房頂上張望集侯。 院中可真熱鬧,春花似錦丐吓、人聲如沸浅悉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)术健。三九已至,卻和暖如春粘衬,著一層夾襖步出監(jiān)牢的瞬間荞估,已是汗流浹背咳促。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勘伺,地道東北人跪腹。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像飞醉,于是被迫代替她去往敵國(guó)和親冲茸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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