get图片爬虫

9-14 514 views

一、简述

当我们浏览网页时,你可能会对一些好看的图片想收集下来,一般都是右键-图片另存为的方式来下载图片。但是有些网站的图片右键是没有图片另存为选项的,当然你也可以使用截图工具将图片截取下来,可是这样的话,清晰度可能就没那么好了。当然你可以查看源代码或者有迅雷下载图片链接等。

下面我们用python的爬虫抓取网页的图片

二、简单抓取网页


#coding=utf-8
<pre>import urllib
def gethtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html
html = gethtml("https://www.ycy114.com")
print(html)

这代码执行报错:AttributeError: module ‘urllib’ has no attribute ‘urlopen’
在网上查了一些资料,有人说是因为你的这个工程目录下可能有一个自己定义的文件与urllib重名,导致上述代码在引用时实际引用的是自定义的那个urllib,结果查找自己的项目文件夹下也没有重名的文件。其实真正原因是在Python3.X中应该用urllib.request。更改后就不会再出现这个错误了。

#coding=utf-8
import urllib.request
import urllib.parse
def gethtml(url):
    page = urllib.request.urlopen(url)
    html = page.read().decode("utf-8")
    return html
html = gethtml("https://www.ycy114.com")
print(html)

解析:Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据。首先,我们定义了一个getHtml()函数:   urllib.urlopen()方法用于打开一个URL地址。   read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。 三、筛选想要的数据 Python 提供了非常强大的正则表达式,我们需要先要了解一点python 正则表达式的知识才行。传送地址:python正则表达式

     比如我们在一个网站上看到一张美丽的图片,如:

按F12打开开发者工具,查看其对应的路径。

修改代码如下:

<pre>import re
import urllib
import urllib.request
import urllib.parse

def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read().decode("utf-8")
    return html

def getImg(html):
    imgre = re.compile(r'<img[^>]*src[=\"\']+([^\"\']*)[\"\'][^>]*>', re.I)
    imglist = re.findall(imgre,html)
    return imglist
html = getHtml("http://www.ivsky.com/")
print (getImg(html))

三、将搜寻到的图片记录下载到本地
这里的核心是用到了urllib.urlretrieve()方法!!!注意这是python2.0的方法路径,由于我用的是python3.0的,上面的方法路径有所改变,这个方法的路径是urllib.request.urlretrieve(),直接将远程数据下载到本地。
通过一个for循环对获取的图片连接进行遍历,为了使图片的文件名看上去更规范,对其进行重命名,命名规则通过x变量加1。保存的位置默认为程序的存放目录。
程序运行完成,将在目录下看到下载到本地的文件。
修改代码如下:

import re
import urllib
import urllib.request
import urllib.parse

def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read().decode("utf-8")
    return html

def getImg(html):
    imgre = re.compile(r'<img[^>]*src[=\"\']+([^\"\']*)[\"\'][^>]*>', re.I)
    imglist = re.findall(imgre,html)
    return imglist
html = getHtml("http://www.ivsky.com/")
print ("图片连接地址如下:")
print (getImg(html))

将图片下载下来

</pre>
<pre># -*- coding: utf-8 -*-
import re
import  urllib
import requests


def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
        # .decode("utf-8")
    return html

def getImg(html):
    imgre = re.compile(r'<img[^>]*src[=\"\']+([^\"\']*)[\"\'][^>]*>', re.I)
    imglist = re.findall(imgre,html)
    return imglist
html = getHtml("http://www.ivsky.com/")
print ("图片连接地址如下:")
info=[]
info=getImg(html)
print(info)
for j in range(len(info)):

    r=requests.get(info[j])
    with open("images/%s.jpg"%j,"wb") as code:
        code.write(r.content)</pre>
<pre>

同样的,我们可以爬取些mp4视频:

</pre>
<pre># -*- coding: utf-8 -*-
import requests
from contextlib import closing
import time
import re
import  urllib

def download_file(url, path):
    with closing(requests.get(url, stream=True)) as r:
        chunk_size = 1024*10
        content_size = int(r.headers['content-length'])
        print '下载开始'
        with open(path, "wb") as f:
            p = ProgressData(size = content_size, unit='Kb', block=chunk_size)
            for chunk in r.iter_content(chunk_size=chunk_size):
                f.write(chunk)
                p.output()


class ProgressData(object):

    def __init__(self, block,size, unit, file_name='', ):
        self.file_name = file_name
        self.block = block/1000.0
        self.size = size/1000.0
        self.unit = unit
        self.count = 0
        self.start = time.time()
    def output(self):
        self.end = time.time()
        self.count += 1
        speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0
        self.start = time.time()
        loaded = self.count*self.block
        progress = round(loaded/self.size, 4)
        if loaded >= self.size:
            print u'\n%s下载完成\r\n'%self.file_name
        else:
            print ('\r{0}下载进度{1:.2f}{2}/{3:.2f}{4} 下载速度{5:.2%} {6:.2f}{7}/s').\
                  format(self.file_name, loaded, self.unit,\
                  self.size, self.unit, progress, speed, self.unit),
            # print '%50s'%('/'*int((1-progress)*50))


def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
        # .decode("utf-8")
    return html

def getmp4(html):
    fage = re.compile('.*lessonUrl = "(http.*?mp4)"', re.I)
    mp4list = re.findall(fage,html)
    return mp4list



if __name__ == '__main__':
    for m in range(8288,8292,1):
        m=str(m)
        url="http://www.maiziedu.com/course/576-"+ m
        html = getHtml(url)
        print ("MP4连接地址如下:")
        info=[]
        info=getmp4(html)
        print(info)

        url = info[0]
        path = m + '.mp4'
        download_file(url, path)

python参数

一、位置参数 调用函数时根据函数定义的参数位置来传递参数。 #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_dict = {1...

阅读全文

zabbix–api接口

Zabbix_api4.4官方文档 Zabbix_api3.4中文文档 一、初识api(zabbix4.4.4版本) API(Application Programming Interface,应用程序编程接口)是一些预先定义的...

阅读全文

将配置文件构造成json格式让zabbix自动发现监控项

一、简单介绍 上文我们使用了zabbix的自动发现的监控来监控服务的端口,重点写了zabbix的发现的一个原理和过程,但是实际上我们服务器的配置是比较复杂的,而...

阅读全文

欢迎留言