Python3直接爬取图片URL并保存示例

  

有时候我们会需要从网络上爬取一些图片,来满足我们形形色色直至不可描述的需求。

  

一个典型的简单爬虫项目步骤包括两步:获取网页地址和提取保存数据。

  

这里是一个简单的从图片url收集图片的例子,可以成为一个小小的开始。

  

<强>获取地址

  

这些图片的URL可能是连续变化的,如从001年递增到099,这种情况可以在程序中将共同的前面部分截取,再在最后递增并字符串化后循环即可。

  

抑或是它们的URL都保存在某个文件中,这时可以读取到列表中:

        def geturl(路径):   url=[]   张开f(路径,“r”):   f的线:   urls.append (line.strip (' \ n '))   返回(url)      

<>强保存图片

  

在python3中,urllib提供了一系列用于操作URL的功能,其中请求的模块可以非常方便地抓取URL内容,也就是发送一个得到请求到指定的页面,然后返回HTTP的响应。具体细节请看注释:

        def requestImg (url、名称、num_retries=3):   img_src=https://www.yisu.com/zixun/url   #打印(img_src)   头={“用户代理”:“Mozilla/5.0 (Windows NT 6.1;WOW64) \   AppleWebKit/537.36 (KHTML,像壁虎)\   Chrome/35.0.1916.114 Safari/537.36”,   “饼干”:“AspxAutoDetectCookieSupport=1”   }   #请求类可以使用给定的头访问URL   要求=urllib.request。请求(url=img_src头=头)   试一试:   响应=urllib.request.urlopen(点播)#得到访问的网址   文件名=名称+“jpg”   张开f(文件名,“世界银行”):   内容=response.read() #获得图片   f.write(内容)#保存图片   response.close ()   除了HTTPError e: # HTTP响应异常处理   打印(e.reason)   除了URLError e: #一定要放到HTTPError之后,因为它包含了前者   打印(e.reason)   除了IncompleteRead或RemoteDisconnected e:   如果num_retries==0: #重连机制   返回   其他:   requestImg (url、名称、num_retries-1)      

<强>其他

  

<>强捕获异常

  

以下是批量爬取网页时可能需要捕获的异常,同时可以看的出,urllib2库对应urllib库,库的而httplib的对应http.client:

           Python2   Pyhton3               urllib2.HTTPError   urllib.error.HTTPError         urllib2.URLError   urllib.error。URLError (HTTPError被包含其中)         httplib.IncompleteRead   http.client.IncompleteRead         httplib.RemoteDisconnected   http.client.RemoteDisconnected            

<强>重连机制

  

在函数参数中设置一个参数num_retries并对其进行初始化,即默认参数。在某些异常出现时可以将该参数递减,再让它递归调用自身,这就是基本的重连机制。

  

<>强修饰器

  

有种设计模式叫修饰器模式,它可以在不修改目标函数代码的前提下,在目标函数执行前后增加一些额外功能。

        def时钟(函数):#修饰器函数,对函数计时   def定时(* args):   t0=timeit.default_timer ()   结果=func (* args)   时间=timeit.default_timer () - t0   name=func.__name__   arg_str=', ' . join (repr (arg)在args参数)   打印(“[% 0.8 fs] % s (% s) %(时间、名称、arg_str))   #打印(' % s (% s)→% r (% 0.8 fs] %(名称、arg_str结果,运行))   返回结果   返回以      

上面这段代码是修饰器函数的一个例子,用来对函数运行时间进行计时,在需要计时的函数上一行添加一点点代码即可:

        @clock      

<强>完整代码

        urllib。错误导入HTTPError URLError   从http。客户进口IncompleteRead, RemoteDisconnected   导入时间,时间   进口urllib.request   进口套接字         #超时=20   # socket.setdefaulttimeout(超时)#等待,防止被简单地反爬         def geturl(路径):   url=[]   张开f(路径,“r”):   f的线:   urls.append (line.strip (' \ n '))   返回(url)         def时钟(函数):#修饰器函数,对函数计时   def定时(* args):   t0=timeit.default_timer ()   结果=func (* args)   时间=timeit.default_timer () - t0   name=func.__name__   arg_str=', ' . join (repr (arg)在args参数)   打印(“[% 0.8 fs] % s (% s) %(时间、名称、arg_str))   #打印(' % s (% s)→% r (% 0.8 fs] %(名称、arg_str结果,运行))   返回结果   返回以         @clock   def requestImg (url、名称、num_retries=3):   img_src=https://www.yisu.com/zixun/url   #打印(img_src)   头={“用户代理”:“Mozilla/5.0 (Windows NT 6.1;WOW64) \   AppleWebKit/537.36 (KHTML,像壁虎)\   Chrome/35.0.1916.114 Safari/537.36”,   “饼干”:“AspxAutoDetectCookieSupport=1”   }   要求=urllib.request。请求(url=img_src头=头)   试一试:   响应=urllib.request.urlopen(要求)   文件名=名称+“jpg”   张开f(文件名,“世界银行”):   内容=response.read ()   f.write(内容)   response.close ()   除了HTTPError e:   打印(e.reason)   除了URLError e:   打印(e.reason)   除了IncompleteRead或RemoteDisconnected e:   如果num_retries==0:   返回   其他:   requestImg (url、名称、num_retries-1)            if __name__==癬_main__”:   URL=geturl (。”/癠RLS.txt”) #换成你的URL文件路径   在线=len (url)   打印(在线)   指数,在枚举值(url):   requestImg(价值,“。/? str(索引).zfill (6) # zfill用来格式化数字:000001   

Python3直接爬取图片URL并保存示例