有时候我们会需要从网络上爬取一些图片,来满足我们形形色色直至不可描述的需求。
一个典型的简单爬虫项目步骤包括两步:获取网页地址和提取保存数据。
这里是一个简单的从图片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用来格式化数字:000001Python3直接爬取图片URL并保存示例