import urllib.request
import os
import random
def url_open(url):
req = urllib.request.Request(url)
req.add_header('User-Agent', 'User-Agent里的内容复制进来')
proxies = ['把代理IP地址复制进来', '把代理IP地址复制进来', '把代理IP地址复制进来']
proxy = random.choice(proxies)
proxy_support = urllib.request.ProxyHandler({'http':proxy}) # 上节课讲过、、
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url) # 去访问Ta
html = response.read()
return html
def get_page(url):
html = url_open(url).decode('utf-8') # |-②所以说要在这里先调用url_open,给Ta url然后把Ta得到的值再decode
# response = urllib.request.urlopen(url) # 去访问Ta
# req = urllib.request.Request(url)
# req.add_header('User-Agent', 'User-Agent里的内容复制进来')
# html = response.read().decode('utf-8')# |-①这里decode返回的就是解码好的,下面有个save_img,如果说把Ta解码成utf-8的形式,图片不能变成这个形式,Ta读不出来,图片是二进制代码的形式
a = html.find('current-comment-page') + 23 # 查找先用find方法,正则表达式下节课
b = html.find(']', a) # 这里的话要给方括号一个起始位置,从a开始找到第一个方括号,返回Ta的索引坐标
html = response.read()
return html[a:b] # 返回一个字符串
def find_imgs(url):
html = url_open(url).decode('utf-8')
img_addrs = [] # 声明一个列表
a = html.find('img src=') # 找到起始地址
while a != -1: # 找不到这个img标签的时候,这个循环会结束
b = html.find('.jpg', a, a+255) # 图片为.jpg的形式,如果不是jpg Ta会继续往后找jpg去,所以要限定Ta一个结束范围,一个网页的的地址最多也不会超过255
if b != -1: # 找到一个jpg,有一个索引值了
img_addrs.append(html[a+9:b+4]) # 把Ta加到这个列表里边去,把Ta地址加进去
else:
b = a + 9 # 这里如果说b找得到,那b会改变,如果说b找不到的话,b的地址也发生改变一下,如果没有这一句的话Ta会在循环在同一个位置
a = html.find('img src=', b) # 这里是个循环,每一次a都会发生改变,a都会进行下一次寻找,a下一次寻找的起始位置就是a上一次的结束位置
return img_addrs # 返回一个包含着图片的地址的列表
def save_imgs(folder, img_addrs):
for each in img_addrs: # 把这些图片保存起来
filename = each.split('/')[-1] # 最后一个反斜杠后面带的就是图片的名字
with open(filename, 'wb') as f: # open(filename就是在OOXX里边写入一个filename的文件,用wb的形式写入
img = url_open(each) # 相当于把这张图片给打开,得到的是一个二进制
f.write(img) #把Ta写进去,这个不需要返回值
def download_mm(folder='OOXX', pages=10):
os.mkdir(folder) # 用os在当前目录创建一个文件夹
os.chdir(folder) # 改变目录
url = "http://@&*¥……(&*@/" # 先随便找一个有图的网站,最后别忘了加反斜杠/
page_num = int(get_page(url)) # 要用模块化的思维来写,抽象成get_page,传给Ta url,因为Ta这里要返回一个字符串,所以要把Ta变为一个整形
for i in range(pages): # 范围前几页
page_num -= i #这里第一次获取的是1293,第二次是1293 -= 1 ,也就是1292,以此类推
page_url = url + 'page-' + str(page_num) + '#comments' # 整形,字符串相加,也就是拼成一个page_url
img_addrs = find_imgs(page_url) # 打开这个链接,在这个页面,找到所有图片的地址,把Ta们保存成一个列表,然后把Ta返回,然后就是说返回了一个列表
save_imgs(folder, img_addrs) # 利用模块化思维,把这些页面都给保存起来
if __name__ == '__main__':
download_mm()