自学爬虫获取照片(零基础)
新手,初级尝试。爬取简单网站的MM照片。写博留念。
步骤如下:
第一步:分析网站
网址:http://www.7160.com/xingganmeinv/list_3_1.html
打开网页元素,找到图片地址位置,地址在img标签下的src键中,获取每张照片的地址(http://img.7160.com/uploads/180130/12-1P1301A92Bc.jpg)然后用二进制格式保存照片。
第二步:获取页面代码
1.导入库:
#!/usr/bin/python # -*- coding:utf-8 -*- import urllib2 from bs4 import BeautifulSoup import itertools import os import time
2.获取页面代码:
def get_infor(url,re_tries =5): headers = {} headers['User_agent']='Mozilla/5.0 *********' try: request = urllib2.urlopen(url) html =request.read() except urllib2.URLError as e: print ('get_infor.error:',e.reason) html =None if re_tries >0: if hasattr(e,'code')and 500<=e.code<600: return get_infor(url,re_tries-1) return html
说明:re_tries=5 该参数是为了解决因为网络不稳定导致的HTTP错误代码5XX错误:
5xx(服务器错误)
此类状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误极大概率是服务器本身的错误,而不是请求出错。
详细说明:
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
建议通过re_tries=x来设置刷新次数,服务器稳定性强时即可获取页面代码。
第三步:从页面代码中找出图片地址
下图为代码截图
def get_picture(html): picture_links=[] soup = BeautifulSoup(html,'html.parser') imgs = soup.find_all('img') for img in imgs: picture_links.append( img['src']) return picture_links分析:
首先建一个空列表,目的是为了接收产生的图片地址。这里面的 soup.find_all('img')产生的是字典形式组成的列表(敲黑板),然后再先遍历这个列表,每个元素是一个字典img,img['src']意为取键为'src'的值,值就是图片地址。然后把每个值加到空列表里。
第四步:保存图片
def printPicture(links,page): os.chdir("C:\study wang\picture") num=1+((page-1)*28) for link in links: u = urllib2.urlopen(link) date = u.read() name =str(num) f = open(name+'.jpg','wb') f.write(date) num = num + 1 f.close for page in itertools.count(1): start_url ='http://www.7160.com/xingganmeinv/list_3_%d.html'%page html = get_infor(start_url) links=get_picture(html) printPicture(links,page) time.sleep(5)
设置保存图片的路径如上图。网页显示每页有28张照片,照片数字名初始值为num,num=1+(page-1)*28。这里的page参数即页码,用itertools模块产生,不懂得可以看一下廖大大的课程。
效果:
简单的图片抓取工具完成。
过程虽然无比简单,但第一次通过自学独立完成,内心是澎湃的。
记录!共勉!