[python学习] 简单爬取图片站点图库中图片

近期老师让学习Python与维基百科相关的知识,无聊之中用Python简单做了个爬取“游讯网图库”中的图片,由于每次点击下一张感觉很浪费时间又繁琐。主要分享的是怎样爬取HTML的知识和Python怎样下载图片。希望对大家有所帮助,同一时候发现该站点的图片都挺精美的,建议阅读原网下载图片,支持游讯网不要去破坏它。

通过浏览游讯网发现它的图库URL为。当中所有图片为0_0_1到0_0_75:

http://pic.yxdown.com/list/0_0_1.html

http://pic.yxdown.com/list/0_0_75.html

同一时候通过下图能够发现游讯网的1-75页个列表,每页中有非常多个主题。每一个主题都有对应的多张图片。

源码例如以下:

(需在本地创建E:\\Picture3目录和Python执行目录创建yxdown目录)

# coding=utf-8
# 声明编码方式 默认编码方式ASCII 參考https://www.python.org/dev/peps/pep-0263/
import urllib
import time
import re
import os

'''
Python下载游迅网图片 BY:Eastmount
'''

'''
**************************************************
#第一步 遍历获取每页相应主题的URL
#http://pic.yxdown.com/list/0_0_1.html
#http://pic.yxdown.com/list/0_0_75.html
**************************************************
'''
fileurl=open('yxdown_url.txt','w')
fileurl.write('****************获取游讯网图片URL*************\n\n')
#建议num=3 while num<=3一次遍历一个页面全部主题,下次换成num=4 while num<=4而不是1-75
num=3
while num<=3:
    temp = 'http://pic.yxdown.com/list/0_0_'+str(num)+'.html'
    content = urllib.urlopen(temp).read()
    open('yxdown_'+str(num)+'.html','w+').write(content)
    print temp
    fileurl.write('****************第'+str(num)+'页*************\n\n')

    #爬取相应主题的URL
    #<div class="cbmiddle"></div>中<a target="_blank" href="/html/5533.html" >
    count=1 #计算每页1-75中详细网页个数
    res_div = r'<div class="cbmiddle">(.*?

)</div>'
    m_div = re.findall(res_div,content,re.S|re.M)
    for line in m_div:
        #fileurl.write(line+'\n')
        #获取每页全部主题相应的URL并输出
        if "_blank" in line: #防止获取列表list/1_0_1.html list/2_0_1.html
            #获取主题
            fileurl.write('\n\n********************************************\n')
            title_pat = r'<b class="imgname">(.*?

)</b>'
            title_ex = re.compile(title_pat,re.M|re.S)
            title_obj = re.search(title_ex, line)
            title = title_obj.group()
            print unicode(title,'utf-8')
            fileurl.write(title+'\n')
            #获取URL
            res_href = r'<a target="_blank" href="(.*?

)"'
            m_linklist = re.findall(res_href,line)
            #print unicode(str(m_linklist),'utf-8')
            for link in m_linklist:
                fileurl.write(str(link)+'\n') #形如"/html/5533.html"

                '''
                **************************************************
                #第二步 去到详细图像页面 下载HTML页面
                #http://pic.yxdown.com/html/5533.html#p=1
                #注意先本地创建yxdown 否则报错No such file or directory
                **************************************************
                '''
                #下载HTML网页无原图 故加'#p=1'错误
                #HTTP Error 400. The request URL is invalid.
                html_url = 'http://pic.yxdown.com'+str(link)
                print html_url
                html_content = urllib.urlopen(html_url).read() #详细站点内容
                #可凝视它 暂不下载静态HTML
                open('yxdown/yxdown_html'+str(count)+'.html','w+').write(html_content)

                '''
                #第三步 去到图片界面下载图片
                #图片的链接地址为http://pic.yxdown.com/html/5530.html#p=1 #p=2
                #点击"查看原图"HTML代码例如以下
                #<a href="javascript:;" style=""onclick="return false;">查看原图</a>
                #通过JavaScript实现 并且该界面存储全部图片链接<script></script>之间
                #获取"original":"http://i-2.yxdown.com/2015/3/18/6381ccc..3158d6ad23e.jpg"
                '''
                html_script = r'<script>(.*?

)</script>'
                m_script = re.findall(html_script,html_content,re.S|re.M)
                for script in m_script:
                    res_original = r'"original":"(.*?

)"' #原图
                    m_original = re.findall(res_original,script)
                    for pic_url in m_original:
                        print pic_url
                        fileurl.write(str(pic_url)+'\n')

                        '''
                        #第四步 下载图片
                        #假设浏览器存在验证信息如维基百科 需加入例如以下代码
                            class AppURLopener(urllib.FancyURLopener):
                                version = "Mozilla/5.0"
                            urllib._urlopener = AppURLopener()
                        #參考 http://bbs.csdn.net/topics/380203601
                        #http://www.lylinux.org/python使用多线程下载图片.html
                        '''
                        filename = os.path.basename(pic_url) #去掉文件夹路径,返回文件名称
                        #No such file or directory 须要先创建文件Picture3
                        urllib.urlretrieve(pic_url, 'E:\\Picture3\\'+filename)
                        #http://pic.yxdown.com/html/5519.html
                        #IOError: [Errno socket error] [Errno 10060] 

                #仅仅输出一个URL 否则输出两个同样的URL
                break 

            #当前页详细内容个数加1
            count=count+1
            time.sleep(0.1)
        else:
            print 'no url about content'

    time.sleep(1)
    num=num+1
else:
    print 'Download Over!!!'
    

当中下载http://pic.yxdown.com/list/0_0_1.html的图片E:\\Picture目录例如以下:

下载http://pic.yxdown.com/list/0_0_3.html的图片E:\\Picture3目录例如以下:

因为代码凝视中有具体的步骤。以下仅仅是简介过程。

1.简单遍历站点。获取每页相应主题的URL。当中每页都有无数个主题。当中主题的格式例如以下:

<!-- 第一步 爬取的HTML代码例如以下 -->
<div class="conbox">
  <div class="cbtop">
  </div>
  <div class="cbmiddle">
  <a target="_blank" href="/html/5533.html" class="proimg">
    <img src="http://i-2.yxdown.com/2015/3/19/KDE5Mngp/a78649d0-9902-4086-a274-49f9f3015d96.jpg" alt="Miss大小姐驾到!

细数《英雄联盟》圈的电竞女神" />
    <strong></strong>
    <p>
      <span>b></b>1836人看过</span>
      <em><b></b>10张</em>
    </p>
    <b class="imgname">Miss大小姐驾到!

细数《英雄联盟》圈的电竞女神</b>
  </a>
  <a target="_blank" href="/html/5533.html" class="plLink"><em>1</em>人评论</a>
  </div>
  <div class="cbbottom">
  </div>
  <a target="_blank" class="plBtn" href="/html/5533.html"></a>
</div>

它是由无数个<div class="conbox"></div>组成,当中我们仅仅须要提取<a target="_blank" href="/html/5533.html" class="proimg">中的href就可以,然后通过URL拼接实现到详细的主题页面。当中相应上面的布局例如以下图所看到的:

  

2.去到详细图像页面 下载HTML页面。如:

http://pic.yxdown.com/html/5533.html#p=1

同一时候下载本地HTML页面能够凝视该句代码。此时须要点击“查看图片”才干下载原图。点击右键仅仅能另存为站点html。

3.我最初打算是是分析“查看原图”的URL来实现下载,其它站点同理是分析“下一页”来实现的。

但我发现它是通过JavaScript实现的浏览,即:

<a href="javascript:;" onclick="return false;" id="photoOriginal">查看原图</a>

同一时候它把全部图片都写在以下代码<script></script>中:

<script>var images = [
{ "big":"http://i-2.yxdown.com/2015/3/18/KDkwMHgp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
  "thumb":"http://i-2.yxdown.com/2015/3/18/KHgxMjAp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
  "original":"http://i-2.yxdown.com/2015/3/18/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
  "title":"","descript":"","id":75109},
{ "big":"http://i-2.yxdown.com/2015/3/18/KDkwMHgp/fec26de9-8727-424a-b272-f2827669a320.jpg",
  "thumb":"http://i-2.yxdown.com/2015/3/18/KHgxMjAp/fec26de9-8727-424a-b272-f2827669a320.jpg",
  "original":"http://i-2.yxdown.com/2015/3/18/fec26de9-8727-424a-b272-f2827669a320.jpg",
  "title":"","descript":"","id":75110},
...
</script>

当中获取原图-original就可以,缩略图-thumb,大图-big,通过正則表達式下载URL:

res_original = r‘"original":"(.*?)"‘ #原图

m_original = re.findall(res_original,script)

4.最后一步就是下载图片。当中我不太会使用线程,仅仅是简单加入了time.sleep(0.1) 函数。下载图片可能会遇到维基百科那种訪问受限。须要对应设置。核心代码例如以下:

import os
import urllib
class AppURLopener(urllib.FancyURLopener):
    version = "Mozilla/5.0"
urllib._urlopener = AppURLopener()
url = "http://i-2.yxdown.com/2015/2/25/c205972d-d858-4dcd-9c8b-8c0f876407f8.jpg"
filename = os.path.basename(url)
urllib.urlretrieve(url , filename)

同一时候我也在本地创建目录Picture3,并txt记录获取的URL,例如以下图所看到的:

最后希望文章对大家有所帮助,简单来说文章就两句话:怎样分析源码通过正則表達式提取指定URL。怎样通过Python下载图片。假设文章有不足之处,请海涵!

(By:Eastmount 2015-3-20 下午5点  http://blog.csdn.net/eastmount/

时间: 2024-10-07 06:08:14

[python学习] 简单爬取图片站点图库中图片的相关文章

[python学习] 简单爬取图片网站图库中图片

最近老师让学习Python与维基百科相关的知识,无聊之中用Python简单做了个爬取"游讯网图库"中的图片,因为每次点击下一张感觉非常浪费时间又繁琐.主要分享的是如何爬取HTML的知识和Python如何下载图片:希望对大家有所帮助,同时发现该网站的图片都挺精美的,建议阅读原网下载图片,支持游讯网不要去破坏它. 通过浏览游讯网发现它的图库URL为,其中全部图片为0_0_1到0_0_75: http://pic.yxdown.com/list/0_0_1.html http://pic.y

[python学习] 简单爬取维基百科程序语言消息盒

文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现:后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识.由于这方面的文章还是较少,希望提供一些思想和方法对大家有所帮助.如果有错误或不足之处,欢迎之处:如果你只想知道该篇文章最终代码,建议直接阅读第5部分及运行截图. 一. 维基百科和Infobox 你可能会疑惑Infobox究竟是个什么东西呢?下面简单介绍. 维基百科作为目前规模最大和增长最快的开放式的在线百科系统,其典型

[Python学习] 简单爬取CSDN下载资源信息

这是一篇Python爬取CSDN下载资源信息的例子,主要是通过urllib2获取CSDN某个人所有资源的资源URL.资源名称.下载次数.分数等信息:写这篇文章的原因是我想获取自己的资源所有的评论信息,但是由于评论采用JS临时加载,所以这篇文章先简单介绍如何人工分析HTML页面爬取信息. 源代码 # coding=utf-8 import urllib import time import re import os #****************************************

Python爬虫--简单爬取图片

今天晚上弄了一个简单的爬虫,可以爬取网页的图片,现在现在做一下准备工作. 需要的库:urllib 和 re urllib库可以理解为是一个url下载器,其中的有两个重要的方法 urllib.urlopen()和urllib.read()这两个方法,具体使用可以在网上查到;re这个库提供对正则表达式支持. 我们要爬取的网页是:http://pic.yesky.com/496/33546996d_13.shtml   把美女筱崎爱给拔下来,其实关键就是要写出一个图片地址对应的正则表达式,下面是代码片

python实现简单爬取图片保存到本地

import requests import os url="http://lofter.nos.netease.com/sogou-Y1gxMDFIeFVHeWhCTkZaMEkzYWx1bGR5WEszQTdRTEZPcndxZWo3Q0dwTG1iZF9uVENpM0tCaUJNOXA1bmZkTA.jpg" root="F://pics//"; path=root+url.split('/')[-1] try:   if not os.path.exists

Python学习笔记之六:在VS中调用Python

1,安装配置好Python本身的运行环境,以能在命令行下运行py脚本为准 2,将Python的根目录下的include文件夹,添加到VS的项目属性->配置属性->C/C++->"附加包含目录"中 3,将Python的根目录下的libs文件夹,添加到VS的项目属性->配置属性->链接器->"附加库目录"中 4,在C++项目中添加Python头文件: #include <python.h> 5,添加必要的Python初始化

[Python学习] 简单网络爬虫抓取博客文章及思想介绍

        前面一直强调Python运用到网络爬虫方面非常有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简单介绍下Python是如何爬去网络数据的,文章知识非常简单,但是也分享给大家,就当简单入门吧!同时只分享知识,希望大家不要去做破坏网络的知识或侵犯别人的原创型文章.主要包括: 1.介绍爬取CSDN自己博客文章的简单思想及过程 2.实现Python源码爬取新浪韩寒博客的316篇文章 一.爬虫的简单思想      最近看刘兵的<Web数据挖掘>知道,在研

Python爬虫实战——爬取今日头条美女图片

? 推荐下我自己创建的Python学习交流群923414804,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程. 笔者是头条的深度使用者,经常用头条完成"看片"大业.若不信的话可以试试在头条搜索街拍,返回的都是一道道靓丽的风景线. 想把图片存下来,该怎么办呢?我们可以用Python爬虫啊. 1.工具 Python3.5,Sublime Text,Windows 7 2.分析(第三步有完整代码)

python——关于简单爬取博客园班级成员发的博文的题目、发布人、阅读、评论,再存到csv文件中

因为老师要以班里每个人发的博客质量作为最后总成绩的评定的一部分,就要把班上所有同学发的博客都统计起来,可以用来评定的因素有:阅读.评论.推荐等,但因为今天只是做一个简单的爬取,推荐这个元素在班级博客中需要点开每一篇博文才能看到获取,就不爬取了,只爬取阅读和推荐,加上每篇博文的发布人和标题. 我先会放上代码,再逐条解释其含义及作用. 代码如下(其中爬取的网页是以我自己的班级为例): 1 from bs4 import BeautifulSoup 2 import pandas as pd 3 im