正则表达式,python批量下载壁纸的落到实处代码

复制代码 代码如下:

  “AttributeError: ‘module’ object has no attribute ‘urlopen’”

  “AttributeError: ‘module’ object has no attribute ‘urlopen’”

新近两周都在求学Python抓取网页方法,职责是批量下载网址上的文件。对于一个正要入门python的人的话,在相当的多细节上都有亟待留神的地点,以下就享受一下自家在初学python进度中蒙受的标题及化解方法。

#! /usr/bin/env python

 

 

 

##python2.7-批量下载壁纸
##壁纸来自桌酷网址,全数权归属其网址
##本代码仅做为交换学习使用,请勿用于商业用途,否则后果自负
##Code by Dreamlikes

案由是Python3里的urllib模块已经发生转移,此处的urllib都应有改成urllib.request。

案由是Python3里的urllib模块已经发出退换,此处的urllib都应该改成urllib.request。

一、用Python抓取网页

import re,urllib,urllib2

 

 

主干办法:

#保存图片的路子
savepath = ‘d:\\picture\\’

修改之后再运营,开采又有如下提醒:

修改现在再运营,开掘又有如下提醒:

[python]
<SPAN style=”FONT-SIZE: 14px”>import urllib2,urllib 
 
url = ” 
req = urllib2.Request(url) 
content = urllib2.urlopen(req).read()</SPAN> 

#壁纸会集的UCR-VL,如下
url =

urlSource = urllib.urlopen(url).read()

 

 

import urllib2,urllib

pattern = re.compile(r'<a href=”(\d+\(\d+\)\.htm)” ‘, re.M |
re.S)
match = pattern.findall(urlSource)

    TypeError: can’t use a string pattern on a bytes-like object

    TypeError: can’t use a string pattern on a bytes-like object

url = ”
req = urllib2.Request(url)
content = urllib2.urlopen(req).read()

if match:
for subUrl in match:
subUrlSource = urllib.urlopen(url[0:url.rfind(‘/’)+1]+subUrl).read()
sPattern = re.compile(r’var thunder_url = “(.*)”;’)
picUrl = sPattern.findall(subUrlSource)[0]
getPic = urllib2.Request(picUrl)
getPic.add_header(‘Referer’,”)

 

 

1)、url为网址,需要加’http://’

正则表达式,python批量下载壁纸的落到实处代码。f = open(savepath+picUrl[picUrl.rfind(‘/’)+1:],’wb’)
f.write(urllib2.urlopen(getPic).read())
f.close()

原因为Python3 findall数据类型用bytes类型,由此在正则表达式前应加多html =
html.decode(‘utf-8’)。

原因为Python3 findall数据类型用bytes类型,因而在正则表达式前应增添html =
html.decode(‘utf-8’)。

2)、content为网页的html源码

print “All done.”

 

 

 

你可能感兴趣的文章:

  • Python爬取qq
    music中的音乐url及批量下载
  • Python完结Youku摄像批量下载功效
  • Python完结批量下载图片的秘诀
  • python达成批量下载博客园博客的措施
  • Python完成批量下载文件
  • 编制Python脚本批量下载DesktopNexus壁纸的科目
  • Python完成的批量下载昂CoraFC文书档案
  • python批量下载图片的三种办法
  • python实现壁纸批量下载代码实例

修改完后运营,成功~,可是鉴于网址原因,仍不得不保留近日的24张背景图。最终代码如下:

修改完后运营,成功~,但是由于网站原因,仍不得不保留最近的24张背景图。最后代码如下:

问题:

#!/usr/bin/env python

#!/usr/bin/env python

1、网址禁止爬虫,无法抓取可能抓取一定数额后封ip

# -*- coding:utf-8 -*-

# -*- coding:utf-8 -*-

减轻:伪装成浏览器进行抓取,插足headers:

# -*- author:arron ni-*-

# -*- author:arron ni-*-

[python] 
<SPAN style=”FONT-SIZE: 14px”>import urllib2,urllib 
 
headers = { #作伪为浏览器抓取  
        ‘User-Agent’:’Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;
rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6′ 
    } 
 
req = urllib2.Request(url,headers=headers) 
content = urllib2.urlopen(req).read()</SPAN> 

# python3抓取bing主页全部背景图片

# python3抓取bing主页全部背景图片

import urllib2,urllib

import urllib,re,sys,os

import urllib,re,sys,os

headers = { #佯装为浏览器抓取
     ‘User-Agent’:’Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;
rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6′
 }

def get_bing_backphoto():

def get_bing_backphoto():

req = urllib2.Request(url,headers=headers)
content = urllib2.urlopen(req).read()[python] view plaincopyprint?
<SPAN style=”FONT-SIZE: 14px”> 
</SPAN> 

    if (os.path.exists(‘photos’)== False):

    if (os.path.exists(‘photos’)== False):

 

        os.mkdir(‘photos’)

        os.mkdir(‘photos’)

 

    for i in range(0,30):

    for亚洲必赢官网, i in range(0,30):

2、抓取网页中的普通话为乱码难题

        url = ”

        url = ”

解决:用BeautifulSoup分析网页(BeautifulSoup是Python的七个用以深入分析网页的插件,其设置及使用办法下文子禽单独研商)

        html = urllib.request.urlopen(url).read()

        html = urllib.request.urlopen(url).read()

首先要求介绍一下网页中的中文编码情势,一般网页的编码会在<meta>标签中标出,方今有两种,分别是GB2312,GBK,GB18030,二种编码是相称的,

        if html == ‘null’:

        if html == ‘null’:

从富含的华语字符个数相比:GB2312 < GBK <
GB18030,因而假设网页标称的编码为GB2312,可是事实上采用了GBK或许GB18030的粤语字符,那么编码工具就能够解析错误,导致编码退回到最核心的windows-2152了。所以消除此类难题分三种情状。

            print( ‘open & read bing error!’)

            print( ‘open & read bing error!’)

1)、若网页的骨子里的中文编码和其标出的符合的话,即未有字符赶上所标称的编码,上面就能够解决

            sys.exit(-1)

            sys.exit(-1)

[python] 
<SPAN style=”FONT-SIZE: 14px”>import urllib,urllib2,bs4 
     
req = urllib2.Request(url) 
content = urllib2.urlopen(req).read() 
content = bs4.BeautifulSoup(content) 
return content</SPAN> 

        html = html.decode(‘utf-8’)

        html = html.decode(‘utf-8’)

import urllib,urllib2,bs4
 
req = urllib2.Request(url)
content = urllib2.urlopen(req).read()
content = bs4.BeautifulSoup(content)
return content
2)、若网页中的粤语字符高出所标称的编码时,要求在BeautifulSoup中传递参数from_encoding,设置为最大的编码字符集GB18030就可以

        reg = re.compile(‘”url”:”(.*?)”,”urlbase”‘,re.S)

        reg = re.compile(‘”url”:”(.*?)”,”urlbase”‘,re.S)

[python] 
<SPAN style=”FONT-SIZE: 14px”>import urllib,urllib2,bs4 
     
req = urllib2.Request(url) 
content = urllib2.urlopen(req).read() 
content = bs4.BeautifulSoup(content,from_encoding=’GB18030′) 
return content</SPAN> 

        text = re.findall(reg,html)

        text = re.findall(reg,html)

import urllib,urllib2,bs4
 
req = urllib2.Request(url)
content = urllib2.urlopen(req).read()
content = bs4.BeautifulSoup(content,from_encoding=’GB18030′)
return content
 

        #

        #

二、用Python下载文件

        for imgurl in text :

        for imgurl in text :

应用Python下载文件的不二等秘书技有好些个,在此只介绍最轻巧易行的一种

            right = imgurl.rindex(‘/’)

            right = imgurl.rindex(‘/’)

[python]
<SPAN style=”FONT-SIZE: 14px”>import urllib 
 
urllib.urlretrieve(url, filepath)</SPAN> 

            name = imgurl.replace(imgurl[:right+1],)

            name = imgurl.replace(imgurl[:right+1],)

import urllib

            savepath = ‘photos/’+ name

            savepath = ‘photos/’+ name

urllib.urlretrieve(url, filepath)
url为下载链接,filepath即为贮存的文本路径+文件名

            urllib.request.urlretrieve(imgurl, savepath)

            urllib.request.urlretrieve(imgurl, savepath)

 

            print (name + ‘ save success!’)

            print (name + ‘ save success!’)

 

get_bing_backphoto()

get_bing_backphoto()

 

 

 

三、使用正则表明式解析网页

将网页源码抓取下来后,就需求深入分析网页,过滤出要用到的字段新闻,平日的形式是用正则表明式剖判网页,多少个例子如下:

[python]
<SPAN style=”FONT-SIZE: 14px”>import re 
 
content = ‘<a href=”;’ 
match = re.compile(r'(?<=href=[“]).*?(?=[“])’) 
rawlv2 = re.findall(match,content)</SPAN> 

import re

content = ‘<a href=”;’
match = re.compile(r'(?<=href=[“]).*?(?=[“])’)
rawlv2 = re.findall(match,content)
用re.compile()编写相称模板,用findall查找,查找content中全数与情势match相相配的结果,重返三个列表,上式的正则表明式意思为相配以‘href=”‘起始,以'”‘结束的字段,使用非贪婪的法则,只取中间的部分

 

私家推举第一篇,条理清晰,不重不漏

在此就不赘述正则表达式的就学,只总括一下我在事实上写正则时的以为要求注意的多少个难点:

1)、必须要运用非贪婪情势开始展览相称,即*?,+?(后加?),因为Python暗许使用贪婪格局打开相配,举例’a.*b’,它会协作文书档案中从第叁个a和最终一个b之间的文本,也正是说要是赶上壹个b,它不会告一段落,会直接寻觅至文书档案末尾,直到它承认找到的b是终极三个。而一般大家只想取某些字段的值,贪婪情势既不能回到无误的结果,还大大浪费了时间,所以非贪婪是少不了的

2)、raw字符串的使用:就算要协作一个.,*这种元字符,就需求加’\’进行转义,即要表示贰个’\’,正则表明式需求多加一个转义,写成’\\’,不过Python字符串又供给对其转义,最后形成re.compile(‘\\\\’),那样就理当如此通晓且很乱,使用raw字符串让正则表明式变得易读,即写成re.compile(r’\\’),另四个办法就是将字符放到字符聚集,即[\],效果一样

3)、()特殊结构的运用:一般的话,()中的相配方式作为分组并能够透过标号访谈,但是有一点独特结构为不一致,它们适用的情状是:作者想要相称href=”xxxx”那些形式,不过本身只需求xxxx的故事情节,而没有供给前后相称的格局,那时就足以用不一样平常结构(?<=),和(?=)来同盟前后文,相称后不回去()中的内容,刚才的例证便利用了这五个布局。

4)、逻辑符的采取:假诺想相称多个方式,使用’|’来贯彻,比方

[python] 
<SPAN style=”FONT-SIZE:
14px”>re.compile(r’.htm|.mid$’)</SPAN> 

re.compile(r’.htm|.mid$’)

 

非常的正是以.htm或.mid结尾的方式,注意未有’&’逻辑运算符

 

四、使用BeautifulSoup深入分析网页

BeautifulSoup是Python的二个插件,用于剖析HTML和XML,是代表正则表明式的利器,下文讲授BS4的装置进程和选择情势

1、安装BS4

 
linux:

进去目录实践:

 1, python setup.py build

 2, python setup.py install

或者easy_install BeautifulSoup

win7:

cmd到调整台 -> 到安装目录 -> 执行下面五个语句就能够

 

2、使用BeautifulSoup解析网页

 

1)、包含包:import bs4

2)、读入:

[python] 
<SPAN style=”FONT-SIZE: 14px”>req = urllib2.Request(url) 
content = urllib2.urlopen(req).read() 
content = bs4.BeautifulSoup(content,from_encoding=’GB18030′) 
</SPAN> 

req = urllib2.Request(url)
content = urllib2.urlopen(req).read()
content = bs4.BeautifulSoup(content,from_encoding=’GB18030′)

3)、查找内容

a、按html标具名查找:

[python] 
<SPAN style=”FONT-SIZE: 14px”>frameurl =
content.findAll(‘frame’)</SPAN> 

frameurl = content.findAll(‘frame’)
framurl为存款和储蓄全数frame标签内容的列表,举个例子frame[0] 为
<framename=”m_rtop” target=”m_rbottom”src=”tops.htm”>

b、按标签属性查找

[python]
<SPAN style=”FONT-SIZE: 14px”>frameurl =
content.findAll(target=True)</SPAN> 

frameurl = content.findAll(target=True)
找寻全数含target属性的标签

[python] 
<SPAN style=”FONT-SIZE: 14px”>frameurl =
content.findAll(target=‘m_rbottom’)</SPAN> 

frameurl = content.findAll(target=‘m_rbottom’)
追寻全数含target属性且值为’m_rbottom’的标签

c、带有正则表明式的探求

[python] 
<SPAN style=”FONT-SIZE: 14px”>rawlv2 =
content.findAll(href=re.compile(r’.htm$’))</SPAN> 

rawlv2 = content.findAll(href=re.compile(r’.htm$’))
检索全体含href属性且值为以’.htm’结尾的价签

d、综合查找

[python] 
<SPAN style=”FONT-SIZE: 14px”>frameurl =
content.findAll(‘frame’,target=‘rtop’)</SPAN> 

frameurl = content.findAll(‘frame’,target=‘rtop’)

搜寻全部frame标签,且target属性值为’rtop’

 

4)、访谈标签属性值和故事情节

a、访谈标签属性值

[python] 
<SPAN style=”FONT-SIZE: 14px”>rawlv2 =
content.findAll(href=re.compile(r’.htm$’)) 
href = rawlv2[i][‘href’]</SPAN> 

rawlv2 = content.findAll(href=re.compile(r’.htm$’))
href = rawlv2[i][‘href’]

 

通过[属性名]就能够访谈属性值,如上式重临的正是href属性的值

 

b)、访谈标签内容

[python] 
<SPAN style=”FONT-SIZE: 14px”>rawlv3 =
content.findAll(href=re.compile(r’.mid$’)) 
songname = str(rawlv3[i].text)</SPAN> 

rawlv3 = content.findAll(href=re.compile(r’.mid$’))
songname = str(rawlv3[i].text)
上式访问了<a
href=…>(内容)</a>标签的骨子里内容,由于text为unicode类型,所以须求用str()做调换

 

依赖最后的硕果,程序功用是抓取www.dugukeji.com上的有着midi文件并下载,须求先创立./midi/dugukeji/文件夹和./midi/linklist文件

[python] 
<SPAN style=”FONT-SIZE: 14px”>#-*- coding:utf-8 -*-
#允许文书档案中有普通话  
import urllib2,urllib,cookielib,threading 
import os 
import re 
import bs4 
import sys 
reload(sys) 
sys.setdefaultencoding(‘utf-8’) #允许打字与印刷unicode字符  
 
 
indexurl = ” 
databasepath = ‘./midi/linklist’ 
path = ‘./midi/dugukeji/’ 
totalresult = {} 
oriresult = {} 
 
def crawl(url): 
    headers = { #假装为浏览器抓取  
        ‘User-Agent’:’Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;
rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6′ 
    } 
    req = urllib2.Request(url,headers=headers) 
    content = urllib2.urlopen(req).read() 
    content = bs4.BeautifulSoup(content,from_encoding=’GB18030′) 
    return content 
 
 
def crawlframe(sourceurl,target): 
    global indexurl 
    content = crawl(sourceurl) 
    #match = re.compile(r'(?<=target=[“]’+target+'[“]
src=[“]).*?(?=[“])’)   #正则说明式方法  
    #frameurl = re.findall(match,content)  
    frameurl = content.findAll(‘frame’,target=target)  
#beautifulsoup方法  
    result = indexurl+frameurl[0][‘src’] 
    return result 
 
def crawllv1(frameurl,st=-1,en=-1): 
    global indexurl 
    content = crawl(frameurl) 
    #match = re.compile(r'(?<=href=[“]).*?(?=[“])’)  
    #rawlv2 = re.findall(match,content)  
    rawlv2 = content.findAll(href=re.compile(r’.htm$’)) 
    result = [] 
    if st==-1 and en==-1: 
        for i in range(len(rawlv2)): 
            result.append(indexurl+rawlv2[i][‘href’]) 
    else: 
        for i in range(st,en): 
            result.append(indexurl+rawlv2[i][‘href’]) 
    #dele = []  
    #for i in range(len(result)):  
    #   if result[i][-4:]!=’.htm’ and
result[i][-5:]!=’.html’:  
    #       dele.append(i)  
#       else:  
#           result[i]=indexurl+result[i]  
#   if len(dele)>0:  
#       for deli in dele:  
#           del result[deli]  
 
    #result.sort()  
    return result 
 
def crawllv2(lv2url): 
    global indexurl 
    content = crawl(lv2url) 
    #match =
re.compile(r'(?<=href=[“]\.\.\/).*?[“>].*?(?=[<])’)  
    #rawlv3 = re.findall(match,content)  
    rawlv3 =
content.findAll(href=re.compile(r'[..].*?[0-9].htm|.mid$’)) 
    #print rawlv3  
    result = {} #结果字典,key:链接,value:歌曲名  
    for i in range(len(rawlv3)): 
        tmp = str(rawlv3[i][‘href’]) 
        #print tmp  
        link = indexurl + tmp[tmp.rfind(‘..’)+3:]  
#有多个’..’,找到最终二个  
        songname = ” 
        if tmp[-4:]==’.htm’:    #内需拜会3级页  
            try: 
                conlv3 = crawl(link) 
            except: 
                print ‘WARNING: visit lv3 url failed!\n’ 
            else: 
                rawlv4 = conlv3.findAll(href=re.compile(r’.mid$’)) 
                if not rawlv4:  #4级页未有.mid下载链接,略过  
                    continue 
                else: 
                    tmp = str(rawlv4[0][‘href’]) 
                    link = indexurl + tmp[tmp.rfind(‘..’)+3:] 
 
        songname = str(rawlv3[i].text) 
#将unicode类型的text转化为string  
        #songname.decode(‘GBK’)  
        #songname.encode(‘utf-8’)  
        songname = songname.replace(‘ ‘,’_’)   
#将songname中空格和换行转化为下划线  
        songname = songname.replace(‘\n’,’_’)  
#本来存在的链接,直接略过  
        if oriresult.has_key(link): 
            continue 
        if totalresult.has_key(link) and
len(songname)<len(totalresult[link]):  
#只要链接已封存且歌曲名长度比当下的长,略过  
            continue 
        else: 
            totalresult[link] = songname 
            result[link] = songname     #进入字典  
    #result.sort()  
    return result 
 
def download(totalresult): 
    for link in totalresult.keys(): 
        filepath = path + totalresult[link] + ‘.mid’ 
        print ‘download: ‘,link,’ -> ‘,filepath,’\n’ 
        urllib.urlretrieve(link, filepath) 
 
 
def readdata(databasepath): 
    datafile = open(databasepath,’r’)   #读数据文件  
    link = datafile.readline() 
    while link: 
        oriresult[link]=” 
        link = datafile.readline() 
    datafile.close() 
 
def writedata(databasepath): 
    datafile = open(databasepath,’a’)  
#充实打开数据文件,将新链接写入文件尾  
    for link in totalresult.keys(): 
        datafile.write(link,’\n’) 
    datafile.close() 
 
if __name__ == ‘__main__’: 
    try: 
        readdata(databasepath)  #做客文件,记录已下载的链接  
    except: 
        print ‘WARNING:read database file failed!\n’ 
    else: 
        print ‘There is ‘,len(oriresult),’ links in database.\n’ 
 
    try: 
        frameurl1 = crawlframe(indexurl,’rtop’)
#抓取主页中一级页url所在frame的url  
    except: 
        print ‘WARNING: crawl lv1 frameurl failed!\n’ 
    try: 
        urllv1 = crawllv1(frameurl1,4,20)       #抓取拔尖页url  
    except: 
        print ‘WARNING: crawl lv1 url failed!\n’ 
 
    for i in urllv1: 
        print ‘lv1 url:’,i 
        try: 
            frameurl2 = crawlframe(i,’rbottom’)
#抓取一流页中二级页url所在frame的url  
        except: 
            print ‘WARNING: crawl lv2 frameurl failed!\n’ 
        else: 
            print ‘\tlv2 frameurl:’,frameurl2 
            try: 
                urllv2 = crawllv1(frameurl2)    #抓取二级页url  
            except: 
                print ‘WARNING: crawl lv2 url failed!\n’ 
            else: 
                for j in urllv2: 
                    print ‘\t\tlv2 url:’,j 
                    try: 
                        urllv3 = crawllv2(j) 
                    except: 
                        print ‘WARNING: crawl lv3 url failed!\n’ 
                    else: 
                        for k in urllv3.keys(): 
                            print ‘\t\t\tlv3
url:’,k,’\tname:’,urllv3[k] 
                        #download(urllv3)  
                             
    print ‘new added midi num:’,len(totalresult) 
    print ‘\nbegin to download…\n’ 
    download(totalresult) 
    print ‘\nWrite database…\n’ 
    writedata(databasepath) 
    print ‘\n\nDone!\n’ 
 
 
 
 
“””
url = ”
req = urllib2.Request(url)
response = urllib2.urlopen(req).read()
response = unicode(response,’GBK’).encode(‘UTF-8’)
print response
“””</SPAN> 

网站地图xml地图