#目前学的爬虫还有潭州教育的直播课,都是千篇一律的requests urllib 下面这个也是,还没有我后面的下载网易云歌单爽来都用到多线程了不过可以用协程,完全异步
1 #!/usr/bin/env/python
2 #-*-coding:utf-8-*-
3
4 '''
5 2018-5-9 20:16:57
6 下次查明原因
7 不会知道为什么报错
8 2018-5-10 19:32:39开始重新看视频
9 把那个代码删了重新编码一下
10 一切运行成功
11 代码没错应该是网站封我ip了 还是很不错的
12 py爬虫还是很强大的
13 2018-5-10 21:12:37
14 '''
15 import requests #这个是访问http协议的模块
16 from urllib.request import urlopen,urlretrieve,urljoin,Request
17 import time #尽量来点休眠
18 import re
19
20 url = 'http://www.mm131.com/xinggan/'
21
22 def get_img(url,path,ref):
23 #url: jpg地址图像真正的地址
24 #path: 图像下载之后保存的路径
25 #ref: 图像的ref值
26 headers = {
27 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
28 'Referer':ref
29 }
30 req = Request(url=url,headers=headers)
31 res = urlopen(req).read()
32 with open(path,'wb') as fp:
33 fp.write(res)
34
35 def download(home_url):
36 #一级列表页面
37 html = requests.get(home_url).content.decode('gbk')
38 urls = re.findall('list_6_[0-9]+.html',html) #相对路径
39 urls = [urljoin(home_url,url) for url in urls]
40
41 # 二级列表页
42 #http://www.mm131.com/qingchun/3982.html
43 urls_2 =[]
44 for url in set(urls):#从一级列表页下面去出来每一个链接
45 html = requests.get(url).content.decode('gbk')
46 for i in re.findall('http://www.mm131.com/xinggan/[0-9]+.html',html):
47 urls_2.append(i)
48 print(urls_2)
49 # 三级列表页
50 #3961_3.html
51 urls_3 = []
52 for url in set(urls_2):
53 html = requests.get(url).content.decode('gbk')
54 for i in re.findall('[0-9_]+.html',html):
55 urls_3.append(i)
56
57 pic_url = {}#key值唯一.不需要额外去重
58 # 字典中:
59 # key: 图像地址
60 # value: Referer值
61 # ..jpg:...3333_1.html
62 # 从这个一个个的图片展示页面下提取真正的图片地址.jpg
63 for url in set(urls_3):
64 # http://img1.mm131.me/pic/3961/2.jpg
65 # http://img1.mm131.me/pic/3961/3.jpg
66 # http://img1.mm131.me/pic/[0-9]+/[0-9]+.jpg
67 html = requests.get(url).content.decode('gbk')
68 try:
69 i = re.findall('http://img1.mm131.me/pic/[0-9]+/[0-9]+.jpg', html)[0]
70 except:
71 print("[Error] 无效的链接:", url)
72 else:
73 pic_url[i] = url
74 # 从展示页面下,右键是可以看到的
75 # 但是直接通过url链接去访问就是不行的
76 # 防盗链
77 index = 0
78 for url in pic_url:
79 # key: 下载地址
80 # value: ref值
81 print('[+] 当前下载%d张:%s' % (index, url))
82 get_img(url=url, path=str(index) + '.jpg', ref=pic_url[url])
83 index += 1
84
85 download(url)