爬蟲(chóng)系列一之爬取旅游網(wǎng)站圖片

前言

接下來(lái)的一段時(shí)間里巷查,將完成一個(gè)爬蟲(chóng)系列文章有序,各位請(qǐng)慢慢看,也請(qǐng)慢慢點(diǎn)贊
這一節(jié)先講講大致工具和目標(biāo)吧

1 目標(biāo)和工具

作為菜鳥(niǎo)先從爬圖片入手吧岛请,下手目標(biāo)就是 <a >螞蜂窩旅游網(wǎng)站</a>
爬蟲(chóng)工具用我們的老朋友scrapy
配置python版本用 virtualenv 比較方便使用
命令

virtualenv -p c:\Python36\python.exe HigEnv #windows7

2 基本步驟

1.創(chuàng)建scrapy工程

cmd cd到合適目錄下旭寿,輸入命令

scrapy startproject mafengwoscrapy

這樣就在當(dāng)前目錄下創(chuàng)建了mafengwoscrapy這個(gè)工程

2.創(chuàng)建一個(gè)spider

在mafengwoscrapy工程下的spiders 目錄下創(chuàng)建一個(gè) mafengwospider.py文件
注釋寫(xiě)的比較清楚可以直接看

# -*- coding: utf-8 -*-
import os
import urllib
from queue import Queue
from urllib import request
import scrapy
from scrapy import Selector, Request
import re


class MafengwospiderSpider(scrapy.Spider):
    name = 'mafengwospider'
    #開(kāi)始爬取的網(wǎng)站
    start_urls = ['http://www.mafengwo.cn/mdd/']
    code_citymap = {}

    def parse(self, response):
        if response.url == 'http://www.mafengwo.cn/mdd/':
            #這是根據(jù)頁(yè)面的來(lái)進(jìn)行xpath匹配
            #這一步的目的是爬取mafengwo網(wǎng)站所有的國(guó)內(nèi)城市和對(duì)應(yīng)的code
            extract = response.xpath("http://div[@class='hot-list clearfix']").xpath(".//a").extract()
            #正則表達(dá)式提取城市code
            pattern = re.compile(r"/(\d*?).html")
            for ahtmltext in extract:
                #將html格式的字符串進(jìn)行xpath篩選的方法
                code_place = Selector(text=ahtmltext).xpath("http://a/@href|//a/text()").extract()
                if len(code_place) == 2:
                    code = pattern.findall(code_place[0])
                    self.code_citymap[code[0]] = code_place[1]
            print(self.code_citymap)
            #將城市code放入隊(duì)列
            #采取深度優(yōu)先的策略爬取
            self.codes = Queue()
            for a in self.code_citymap.keys():
                self.codes.put(a)
            citycode = self.codes.get()
            #注意下,這個(gè)http://www.mafengwo.cn/yj/%s/1-0-1.html的url是mafengwo網(wǎng)站每一個(gè)城市的游記列表的入口
            #meta用來(lái)標(biāo)識(shí)請(qǐng)求來(lái)源和請(qǐng)求額外參數(shù)很方便
            yield Request(url=r"http://www.mafengwo.cn/yj/%s/1-0-1.html" % (citycode),
                          meta={"code": citycode, "type": "list"})
            ##判斷請(qǐng)求是城市游記文章列表頁(yè)
        elif response.meta["type"] == "list":
            code = response.meta["code"]
            if 'pageindex' not in response.meta:
                pageindex = 1;
            else:
                pageindex = response.meta["pageindex"]
            pageindex += 1
            #這個(gè)xpath能篩選出該頁(yè)所有的文章信息
            extract = response.xpath(
                r"http://li[@class='post-item clearfix']/div[@class='post-cover']/a/@href"
            ).extract()
            if len(extract) > 0:
                #爬取分頁(yè)中的每一篇文章
                for followurl in extract:
                    yield response.follow(url=followurl, priority=20,
                                          meta={"code": code, "type": "article"})
                #每個(gè)城市只爬到第2頁(yè)
                if (pageindex <=2):
                    yield response.follow(
                        url="http://www.mafengwo.cn/yj/%s/1-0-%s.html" % (code, pageindex),
                        priority=10,meta={"code": code, "type": "list", "pageindex": pageindex}
                    )
                #爬下一個(gè)城市
                elif not self.codes.empty():
                    citycode = self.codes.get()
                    yield Request(url=r"http://www.mafengwo.cn/yj/%s/1-0-1.html" % (citycode),
                                  meta={"code": citycode, "type": "list"})
            #當(dāng)前城市返回空崇败,爬下一個(gè)城市
            elif not self.codes.empty():
                citycode = self.codes.get()
                yield Request(url=r"http://www.mafengwo.cn/yj/%s/1-0-1.html" % (citycode),
                              meta={"code": citycode, "type": "list"})
                #判斷請(qǐng)求的是文章詳情頁(yè)
        elif response.meta["type"] == "article":
            code = response.meta["code"]
            htmlname = response.url.split("/")[-1].replace(r".html", "")
            #提取出該文章中所有的圖片鏈接
            images = response.xpath(
                "http://img[@class='_j_lazyload _j_needInitShare']/@data-src").extract()
            if len(images) == 0:
                print(htmlname + " failed")
            for i in range(len(images)):
                #所有圖片下載到本地
                print(images[i])
                filedir = "E:/images/mafengwo/%s" % (self.code_citymap[code])
                if not os.path.exists(filedir):
                    os.makedirs(filedir)
                imagefilepath="%s/%s_%s.jpg" % (filedir, htmlname, i)
                if not os.path.exists(imagefilepath):
                    #python3 urllib下載簡(jiǎn)單圖片或者文件的方法
                    req=urllib.request.Request(images[i])
                    with urllib.request.urlopen(req,timeout=10) as f:
                        with open(imagefilepath,"wb") as writef:
                            writef.write(f.read())

整體的爬蟲(chóng)代碼需要結(jié)合網(wǎng)頁(yè)的源碼看盅称,沒(méi)什么細(xì)節(jié)的就不多說(shuō)了,另外在工程目錄
的settings.py中,改下參數(shù)


# 設(shè)置為不遵守robot協(xié)議
#以及每次scrapy request 請(qǐng)求最小間隔為1s缩膝,防止被反爬蟲(chóng)
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
3.啟動(dòng)爬蟲(chóng)

爬蟲(chóng)啟動(dòng)很簡(jiǎn)單的混狠,cd 到 mafengwoscrapy工程目錄下執(zhí)行

scrapy crawl mafengwospider 即可
4.結(jié)果

爬取的速度不是很快,結(jié)果如截圖所示


城市列表.png

城市里面的游記.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逞盆,一起剝皮案震驚了整個(gè)濱河市檀蹋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌云芦,老刑警劉巖俯逾,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舅逸,居然都是意外死亡桌肴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)琉历,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坠七,“玉大人,你說(shuō)我怎么就攤上這事旗笔”胫茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蝇恶,是天一觀的道長(zhǎng)拳魁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)撮弧,這世上最難降的妖魔是什么潘懊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贿衍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸辈。我一直安慰自己,他們只是感情好裙椭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布揉燃。 她就那樣靜靜地躺著,像睡著了一般正驻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姑曙,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天伤靠,我揣著相機(jī)與錄音,去河邊找鬼宴合。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贞言,可吹牛的內(nèi)容都是我干的阀蒂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酗失,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼级零!你這毒婦竟也來(lái)了滞乙?” 一聲冷哼從身側(cè)響起斩启,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兔簇,失蹤者是張志新(化名)和其女友劉穎硬耍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體经柴,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坯认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陋气。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痒玩,死狀恐怖蠢古,靈堂內(nèi)的尸體忽然破棺而出褒脯,到底是詐尸還是另有隱情,我是刑警寧澤番川,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布颁督,位于F島的核電站,受9級(jí)特大地震影響屿讽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伐谈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一诵棵、第九天 我趴在偏房一處隱蔽的房頂上張望祝旷。 院中可真熱鬧,春花似錦距贷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至闽撤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哟旗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工饱亮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留近上,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓壹无,卻偏偏與公主長(zhǎng)得像斗锭,于是被迫代替她去往敵國(guó)和親失球。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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