爬虫系列一之爬取旅游网站图片

前言

接下来的一段时间里,将完成一个爬虫系列文章,各位请慢慢看,也请慢慢点赞
这一节先讲讲大致工具和目标吧

1 目标和工具

作为菜鸟先从爬图片入手吧,下手目标就是 <a href="http://www.mafengwo.cn">蚂蜂窝旅游网站</a>
爬虫工具用我们的老朋友scrapy
配置python版本用 virtualenv 比较方便使用
命令

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

2 基本步骤

1.创建scrapy工程

cmd cd到合适目录下,输入命令

scrapy startproject mafengwoscrapy

这样就在当前目录下创建了mafengwoscrapy这个工程

2.创建一个spider

在mafengwoscrapy工程下的spiders 目录下创建一个 mafengwospider.py文件
注释写的比较清楚可以直接看

# -*- 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'
    #开始爬取的网站
    start_urls = ['http://www.mafengwo.cn/mdd/']
    code_citymap = {}

    def parse(self, response):
        if response.url == 'http://www.mafengwo.cn/mdd/':
            #这是根据页面的来进行xpath匹配
            #这一步的目的是爬取mafengwo网站所有的国内城市和对应的code
            extract = response.xpath("//div[@class='hot-list clearfix']").xpath(".//a").extract()
            #正则表达式提取城市code
            pattern = re.compile(r"/(\d*?).html")
            for ahtmltext in extract:
                #将html格式的字符串进行xpath筛选的方法
                code_place = Selector(text=ahtmltext).xpath("//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放入队列
            #采取深度优先的策略爬取
            self.codes = Queue()
            for a in self.code_citymap.keys():
                self.codes.put(a)
            citycode = self.codes.get()
            #注意下,这个http://www.mafengwo.cn/yj/%s/1-0-1.html的url是mafengwo网站每一个城市的游记列表的入口
            #meta用来标识请求来源和请求额外参数很方便
            yield Request(url=r"http://www.mafengwo.cn/yj/%s/1-0-1.html" % (citycode),
                          meta={"code": citycode, "type": "list"})
            ##判断请求是城市游记文章列表页
        elif response.meta["type"] == "list":
            code = response.meta["code"]
            if 'pageindex' not in response.meta:
                pageindex = 1;
            else:
                pageindex = response.meta["pageindex"]
            pageindex += 1
            #这个xpath能筛选出该页所有的文章信息
            extract = response.xpath(
                r"//li[@class='post-item clearfix']/div[@class='post-cover']/a/@href"
            ).extract()
            if len(extract) > 0:
                #爬取分页中的每一篇文章
                for followurl in extract:
                    yield response.follow(url=followurl, priority=20,
                                          meta={"code": code, "type": "article"})
                #每个城市只爬到第2页
                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}
                    )
                #爬下一个城市
                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"})
            #当前城市返回空,爬下一个城市
            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"})
                #判断请求的是文章详情页
        elif response.meta["type"] == "article":
            code = response.meta["code"]
            htmlname = response.url.split("/")[-1].replace(r".html", "")
            #提取出该文章中所有的图片链接
            images = response.xpath(
                "//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下载简单图片或者文件的方法
                    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())

整体的爬虫代码需要结合网页的源码看,没什么细节的就不多说了,另外在工程目录
的settings.py中,改下参数


# 设置为不遵守robot协议
#以及每次scrapy request 请求最小间隔为1s,防止被反爬虫
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
3.启动爬虫

爬虫启动很简单的,cd 到 mafengwoscrapy工程目录下执行

scrapy crawl mafengwospider 即可
4.结果

爬取的速度不是很快,结果如截图所示


城市列表.png

城市里面的游记.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容