开发工具与关键技术:Python IDEL、Python
作者:曾浩源
撰写时间:2019年08月14日
想要爬取网站内的图片,首先想到的是引用urllib模块内的request(打开和浏览url中内容),然后就是os模块(文件/目录方法)创建文件夹和保存图片,最后就是引用random模块的choice()方法返回元组或列表内的随机项,从而分配代理浏览网站。
import urllib.request
import os
import random
引用所需要的模块后,就是看看使用代理爬取网站内图片需要哪些流程,如:
1、首先肯定是创建文件夹(创建完成后将工作目录切换到新建的文件夹内)
2、打开网址(这里使用代理就不分开写了)
3、获取该网站图片分页的页数(如果没有分页该方法可以不用)
4、得到某一页后,获取该页的所有图片(确定网址后获取该页面的所有图片)
5、最后就是保存图片到文件夹
一、主函数
def dowmload_mm(url="http://jandan.net/ooxx/",folder="OOXX",pages=24):#主函数
if not os.path.exists(folder):
os.mkdir(folder)#创建文件夹
os.chdir(folder)#将工作目录切换到要保存图片的目录
page_num = get_page(url)
for i in range(pages):
page = page_num - (i + 1)
page_url = url + 'page-' + str(page) + "#comments"
img_addrs = find_imgs(page_url)
save_imgs(folder,img_addrs)
1、该主函数有三个函数,并且都有默认值(url网址、folder保存的文件夹、pages爬取的页数)
2、判断文件夹是否存在,不存在就新建,然后将工作目录切换到新建的文件夹
3、打开网址
4、for循环,循环一次打开不同的页数,然后获取那一页的图片,最后保存图片,之后执行下一页
二、打开网址
def url_open(url):#打开网址
req = urllib.request.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400")
#使用代理
proxies = ['171.39.11.30:8123', '222.222.250.143:8060', '182.101.207.11:8080']
proxy = random.choice(proxies)
proxy_support = urllib.request.ProxyHandler({'https':proxy})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read()
return html
1、使用urllib模块内request访问网址,然后添加一个HTTP报头(用于防止被认出是代码执行访问网址)
2、声明一个列表存放代理IP,使用random模块的choice()方法随机返回一个代理IP对网址进行访问
3、使用urllib.request的urlopen()函数打开url,返回response后使用read()方法读取,获取该网址的html页面(现在还不是utf-8编码),返回html
三、获取该网站图片分页的页数
def get_page(url):#根据某页数获取该页的网址
html = url_open(url).decode('utf-8')
a = html.find('current-comment-page') + 23
b = html.find(']', a)
return int(html[a:b])
1、首先需要打开网址才内获取该网站有多少页,调用打开网址方法,将得到的html转为utf-8编码
2、根据该网站内实际情况获取总页数(有很多种方法,如:正则获取,标签获取,字符串搜索获取等等)
3、返回获取到页数
四、得到某一页后,获取该页的所有图片
def find_imgs(url):#得到某一页后,获取该页的所有图片
html = url_open(url).decode('utf-8')
img_addrs = []
a = html.find('img src=')
while a != -1:
b = html.find('.jpg', a, a + 255)
if b != -1:
img_addrs.append(html[a+11:b+4])
else:
b = a + 9
a = html.find('img src=', b)
return img_addrs
1、首先需要打开网址才内获取该网站有多少页,调用打开网址方法,将得到的html转为utf-8编码
2、声明一个列表存放获取到的图片链接,然后根据网址的实际情况获取图片的链接,如(正则获取,标签获取,字符串搜索获取等等)
3、返回图片链接列表
五、保存图片到文件夹
def save_imgs(folder,img_addrs):#保存图片到文件夹
for each in img_addrs:
filename = each.split('/')[-1]
with open(filename, 'wb') as f:
img = url_open('http://' + str(each))
f.write(img)
1、该方法的参数有文件夹名称和图片链接列表,根据图片链接列表for循环
2、图片名称由图片链接根据/分割的最后一个字符串命名
3、最后就是打开文件,并拥有读取写入权限,打开图片链接,爬取图片,写入文件
最后的最后就是调用主函数,如果要保存为一个py文件需要:
#一个.py文件,如果是自身在运行,那么他的__name__值就是"__main__"
if __name__ == '__main__':
dowmload_mm()