Python爬虫学习(一)

爬虫学习

目标:爬取壁纸并保存到本地 目标网站:http://desk.zol.com.cn/dongman/


(最后更改时间:2018/11/4)
要求

  • 1.壁纸必须保存到脚本运行目录下的的 IMAGES文件夹内。
  • 2.保存的图片必须以对应标题名和分辨率来命名,如:秋田君的小漫画 - 1920x1200.jpg。
  • 3.图片分辨率应该是可选分辨率中最高的。
  • 4.提示信息格式:正在下载 (下载数量):(图片名字)。
  • 5.要有错误处理并给出相应提示,如:图片下载失败、网络超时的处理等。

要用到的Python库

  • requests(需安装)
  • os
  • lxml中的etree(xpath)(需安装)

相关语法:


准备好这些以后,就可以开始写爬虫了
引入所需库文件

from lxml import etree
import requests
import os

设置头文件

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
}

写一个解析html的函数,参数为要获取的网址,返回值是解析后的,能用xpath进行定位的xml变量。
步骤:

  • 使用requests中的get方法对网页进行请求,保存在变量r中
  • 将r的编码方式设置为当前编码,防止乱码
  • 使用etree.HTML()解析r.text(),保存在变量dom中
  • 返回dom
def getText(url):
    r = requests.get(url, headers = headers)
    r.encoding = r.apparent_encoding
    dom = etree.HTML(r.text)
    return dom

目标是爬取图片,还需要一个能保存图片的函数:
保存图片与文字不太一样,需要将content(二进制)写入文件而不是text
使用open创建一个文件,因为命名需要使用名字-分辨率的格式来命名,所以我们使用name变量储存名字,px储存分辨率,所以除了将图片的url传入外,还要将这两个参数传进函数
使用f-string方法连接变量和字符串

def getImg(url, name, px):
    r = requests.get(url, headers = headers)
    if(r.status_code != 200):
        print("图片下载失败")
        return
    r.encoding = r.apparent_encoding
    f = open(f'{name}-{px}.jpg', 'wb')
    f.write(r.content)

然后就是文件的保存位置问题,要求是IMAGES文件夹由脚本自动创建,没有就创建,否则不创建。
需要用到os库:

  • 使用os.getcwd()函数得到脚本的工作路径,拼接字符串\IMAGES就得到了脚本工作目录下IMAGES文件夹的路径
  • 使用os.path.exists(path)判断文件夹十分存在,不存在则创建
  • 使用os.makedirs(path)创建文件夹
  • 使用os.chdir将工作目录改为IMAGES文件夹下,即使图片保存到该文件夹
def createFileFolder():
    path = os.getcwd() + "\IMAGES"
    if not os.path.exists(path):
        os.makedirs(path)
    os.chdir(path)

准备工作完成
我们观察网页结构,发现需要爬取的壁纸共41页,每页的网址规律为:http://desk.zol.com.cn/dongman/x.html
x为页码数
所以写一个循环,次数为41,每次循环爬取当前页上的所有壁纸
firststep:获取图片名和组图链接
  图片名在li标签下,属性值为class="photo-list-padding",使用xpath轻松得到图片名,总张数,时间,因为我们目标是爬取每组图片的第一张,所以有用信息只有图片名。组图链接在class="photo-list-padding"的li标签的href属性中,获取标签中的属性值可以在定位到该标签后使用//@'属性值'得到
secondstep:获取图片最高分辨率对应网址和最高分辨率
  同理可以发现分辨率在dd标签下的a标签的id属性中,而图片链接则在href属性中。
注意:有个严重的问题,从第二页壁纸开始,有一些壁纸不提供下载服务,这些图片的分辨率在网页中找不到,而且也无法获取像其他图片那样获取图片链接,但这类图片在网页中还有个展示的图片,分辨率均为960x600,对应网址都在img标签中的src属性中,分两种情况讨论,程序才不会报错,否则会报错提示分辨率对应的列表为空!
thirdstep:下载图片
  一切都准备好了,写个循环使用getImg()下载图片即可,别忘了打印提示信息


最后附上完整代码

from lxml import etree
import requests
import os

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
}

def getText(url):
    r = requests.get(url, headers = headers)
    r.encoding = r.apparent_encoding
    dom = etree.HTML(r.text)
    return dom

def getImg(url, name, px):
    r = requests.get(url, headers = headers)
    if (r.status_code != 200):
        print("图片下载失败")
        return
    r.encoding = r.apparent_encoding
    f = open(f'{name}-{px}.jpg', 'wb')
    f.write(r.content)

def createFileFolder():
    path = os.getcwd() + "\image"
    if not os.path.exists(path):
        os.makedirs(path)
    os.chdir(path)

def getImgName_href(dom):#得到图片名和图片详细链接
    name = dom.xpath('//li[@class="photo-list-padding"]//em//text()')
    href = dom.xpath('//li[@class="photo-list-padding"]//@href')
    return name, href

def getImgHref_Px(href):#得到最高分辨率图片地址和最高分辨率
    dom = getText(href)
    try:
        px = dom.xpath('//dd[@id="tagfbl"]//a//@id')[0]
        imgUrl = dom.xpath('//dd[@id="tagfbl"]//a[@target="_blank"]//@href')[0]
        dom_1 = getText(host + imgUrl)
        imgHref = dom_1.xpath('//img//@src')[0]
        return imgHref, px
    except:
        imgHref = dom.xpath('//div[@id="mouscroll"]//img//@src')[0]
        return imgHref, "960x600"

host = "http://desk.zol.com.cn"
target = "http://desk.zol.com.cn/dongman/"
cnt = 0
createFileFolder()  # 创建文件夹并将图片下载换到image

for x in range(1, 42):
    dom = getText("http://desk.zol.com.cn/dongman/" + str(x) + ".html")
    name, href = getImgName_href(dom)
    for i in range(0, len(href)):  # 下载壁纸QAQ
        cnt = cnt + 1
        print("正在下载" + str(cnt) + ":" + name[i])
        imgHref, px = getImgHref_Px(host + href[i])
        getImg(imgHref, name[i], px)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • Python爬虫学习(一) 在这个暑假之前,我学了一下简单的python爬虫,但忘得差不多了,这几日决定复习一下,...
    挖洞挖洞阅读 499评论 0 1
  • 这几天发现一个比较适合Python爬虫初学者的网站,我是跟着里边的kingname老师学习,这就当作是一个学习笔记...
    MuYi0420阅读 517评论 0 4
  • 其实node.js也可以做爬虫,相信前端的同学已经有所了解,但今天我们要讲的是如何用python,python实现...
    我是上帝可爱多阅读 352评论 0 3
  • 课程目标 爬取百度百科Python词条相关多个页面的词条和简述 并将数据以表格的形式保存成html 程序包含五个模...
    牵丝笼海阅读 453评论 0 2
  • 灵动
    下平阅读 95评论 0 0