Python爬虫下载美女图片(不同网站不同方法)!全教给你。

简介:声明:以下代码,Python版本3.6完美运行,但因网站日新月异,下面代码可能在有些网站已不适用,读者朋友理解思路就好一、思路介绍  不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法  1. 浏览器 ...

声明:以下代码,Python版本3.6完美运行,但因网站日新月异,下面代码可能在有些网站已不适用,读者朋友理解思路就好
一、思路介绍
  不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法
  1. 浏览器浏览分析地址变化规律
  2. Python测试类获取网页内容,从而获取图片地址
  3. Python测试类下载图片,保存成功则爬虫可以实现
二、豆瓣美女(难度:?)
  1. 网址:https://www.dbmeinv.com/dbgroup/show.htm
  浏览器里点击后,按分类和页数得到新的地址:"https://www.dbmeinv.com/dbgroup/show.htm?cid=%s&pager_offset=%s" % (cid, index)
  (其中cid:2-胸 3-腿 4-脸 5-杂 6-臀 7-袜子 index:页数)
  2. 通过python调用,查看获取网页内容,以下是Test_Url.py的内容 
私信小编47 领取完整项目代码!

Python爬虫下载美女图片(不同网站不同方法)!全教给你。

<code> 1 from urllib import request
2 import re
3 from bs4 import BeautifulSoup
4
5
6 def get_html(url):
7 req = request.Request(url)
8 return request.urlopen(req).read()
9
10
11 if __name__ == '__main__':
12 url = "https://www.dbmeinv.com/dbgroup/show.htm?cid=2&pager_offset=2"
13 html = get_html(url)
14 data = BeautifulSoup(html, "lxml")
15 print(data)
16 r = r'(https://\\\\S+\\\\.jpg)'
17 p = re.compile(r)
18 get_list = re.findall(p, str(data))
19 print(get_list)/<code>
Python爬虫下载美女图片(不同网站不同方法)!全教给你。

贝尔的改进的收割机是由帕特里克·贝尔patrickbell设计的

  通过urllib.request.Request(Url)请求网站,BeautifulSoup解析返回的二进制内容,re.findall()匹配图片地址
  最终print(get_list)打印出了图片地址的一个列表
  3. 通过python调用,下载图片,以下是Test_Down.py的内容

Python爬虫下载美女图片(不同网站不同方法)!全教给你。

Woman typing on keyboard . Mixed media

<code> 1 from urllib import request
2

3
4 def get_image(url):
5 req = request.Request(url)
6 get_img = request.urlopen(req).read()
7 with open('E:/Python_Doc/Images/DownTest/001.jpg', 'wb') as fp:
8 fp.write(get_img)
9 print("Download success!")
10 return
11
12
13 if __name__ == '__main__':
14 url = "https://ww2.sinaimg.cn/bmiddle/0060lm7Tgy1fn1cmtxkrcj30dw09a0u3.jpg"
15 get_image(url)/<code>

  通过urllib.request.Request(image_url)获取图片,然后写入本地,看到路径下多了一张图片,说明整个爬虫实现是可实现的
  4. 综合上面分析,写出完整爬虫代码 douban_spider.py
View Code
  运行程序,进入文件夹查看,图片已经不停的写入电脑了!
  5. 分析:豆瓣图片下载用比较简单的爬虫就能实现,网站唯一的控制好像只有不能频繁调用,所以豆瓣不适合用多线程调用
      豆瓣还有一个地址:https://www.dbmeinv.com/dbgroup/current.htm有兴趣的读者朋友可以自己去研究
三、MM131网(难度:??)
  1. 网址:http://www.mm131.com
  浏览器里点击后,按分类和页数得到新的地址:"http://www.mm131.com/xinggan/list_6_%s.html" % index
  (如果清纯:"http://www.mm131.com/qingchun/list_1_%s.html" % index , index:页数)
  2. Test_Url.py,双重循化先获取图片人物地址,在获取人物每页的图片

<code> 1 from urllib import request 

2 import re
3 from bs4 import BeautifulSoup
4
5
6 def get_html(url):
7 req = request.Request(url)
8 return request.urlopen(req).read()
9
10
11 if __name__ == '__main__':
12 url = "http://www.mm131.com/xinggan/list_6_2.html"
13 html = get_html(url)
14 data = BeautifulSoup(html, "lxml")
15 p = r"(http://www\\\\S*/\\\\d{4}\\\\.html)"
16 get_list = re.findall(p, str(data))
17 # 循化人物地址
18 for i in range(20):
19 # print(get_list[i])
20 # 循环人物的N页图片
21 for j in range(200):
22 url2 = get_list[i][:-5] + "_" + str(j + 2) + ".html"
23 try:
24 html2 = get_html(url2)
25 except:
26 break
27 p = r"(http://\\\\S*/\\\\d{4}\\\\S*\\\\.jpg)"
28 get_list2 = re.findall(p, str(html2))
29 print(get_list2[0])
30 break/<code>

  
  3. 下载图片 Test_Down.py,用豆瓣下载的方法下载,发现不论下载多少张,都是一样的下面图片
  

Python爬虫下载美女图片(不同网站不同方法)!全教给你。

  这个就有点尴尬了,妹子图片地址都有了,就是不能下载,浏览器打开的时候也是时好时坏,网上也找不到原因,当然楼主最终还是找到原因了,下面先贴上代码

<code> 1 from urllib import request
2 import requests
3
4
5 def get_image(url):
6 req = request.Request(url)
7 get_img = request.urlopen(req).read()
8 with open('E:/Python_Doc/Images/DownTest/123.jpg', 'wb') as fp:
9 fp.write(get_img)
10 print("Download success!")
11 return
12
13
14 def get_image2(url_ref, url):
15 headers = {"Referer": url_ref,
16 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
17 '(KHTML, like Gecko)Chrome/62.0.3202.94 Safari/537.36'}
18 content = requests.get(url, headers=headers)
19 if content.status_code == 200:
20 with open('E:/Python_Doc/Images/DownTest/124.jpg', 'wb') as f:
21 for chunk in content:
22 f.write(chunk)
23 print("Download success!")
24
25
26 if __name__ == '__main__':
27 url_ref = "http://www.mm131.com/xinggan/2343_3.html"
28 url = "http://img1.mm131.me/pic/2343/3.jpg"
29 get_image2(url_ref, url)/<code>

  可以看到下载成功,改用requests.get方法获取图片内容,这种请求方法方便设置头文件headers(urllib.request怎么设置headers没有研究过),headers里面有个Referer参数,必须设置为此图片的进入地址,从浏览器F12代码可以看出来,如下图


  

Python爬虫下载美女图片(不同网站不同方法)!全教给你。

  
  4. 测试都通过了,下面是汇总的完整源码
View Code
  运行程序后,图片将源源不断的写入电脑
  
  5. 分析:MM131图片下载主要问题是保存图片的时候需要用headers设置Referer
  
四、煎蛋网(难度:???)
  1. 网址:http://jandan.net/ooxx


  浏览器里点击后,按分类和页数得到新的地址:http://jandan.net/ooxx/page-%s#comments % index
  (index:页数)
  2. Test_Url.py,由于通过urllib.request.Request会被拒绝
  通过requests添加headers,返回的html文本如下  

<code> 1 ......
2 3 4 3535967
5
6

7
8 d0c4TroufRLv8KcPl0CZWwEuhv3ZTfJrTVr02gQHSmnFyf0tWbjze3F+DoWRsMEJFYpWSXTd5YfOrmma+1CKquxniG2C19Gzh81OF3wz84m8TSGr1pXRIA 9
10
11 ....../<code>

  从上面关键结果可以看到,后面的一长串哈希字符才是图片地址,网站打开时候动态转换为图片地址显示的,不过上有政策,下有对策,那就把这些hash字符串转为图片地址了,怎么转呢? 以下提供两种方案
  (1)通过Python的execjs模块直接调用JS里面的函数,将这个hash转为图片地址,具体实现就是把当前网页保存下来,然后找到里面的js转换方法函数,单独拎出来写在一个JS里面
  调用的JS和方法如下:OOXX1.js  CallJS.python

<code>1 function OOXX1(a,b) {
2 return md5(a)
3 }
4 function md5(a) {
5 return "Success" + a
6 }/<code>
<code> 1 import execjs 

2
3
4 # 执行本地的js
5 def get_js():
6 f = open("OOXX1.js", 'r', encoding='UTF-8')
7 line = f.readline()
8 htmlstr = ''
9 while line:
10 htmlstr = htmlstr + line
11 line = f.readline()
12 return htmlstr
13
14
15 js = get_js()
16 ctx = execjs.compile(js)
17 ss = "SS"
18 cc = "CC"
19 print(ctx.call("OOXX1", ss, cc))/<code>

  此种方法只提供思路,楼主找到的JS如下 OOXX.js,实际调用报错了,这个方法应该会比方法二速度快很多,所以还是贴上未完成代码供读者朋友参阅研究
View Code
  (2)通过Python的selenium调用Chrome的无头浏览器(说明:低版本的Python可以用Phantomjs无头浏览器,Python3.6是直接弃用了这个浏览器,只好选择Chrome)
  用Chrome无头浏览器需要Chrome60以上版本,根据Chrome版本下载对应(下图对面关系)的chromedrive.exe(说是好像Chrome60以上版本自带无头浏览器功能,楼主没有成功实现,还是老老实实下载了chromedriver,下载地址:http://chromedriver.storage.googleapis.com/index.html)
  

<code> 1 from urllib import request
2 import re
3 from selenium import webdriver
4 import requests
5
6

7 def get_html(url):
8 req = request.Request(url)
9 return request.urlopen(req).read()
10
11
12 def get_html2(url):
13 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
14 '(KHTML, like Gecko)Chrome/62.0.3202.94 Safari/537.36'}
15 return requests.get(url, headers=headers).text
16
17
18 # 用chrome headless打开网页
19 def get_html3(url):
20 chromedriver = "C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chromedriver.exe"
21 options = webdriver.ChromeOptions()
22 options.add_argument('--headless')
23 browser = webdriver.Chrome(chromedriver, chrome_options=options)
24 browser.get(url)
25 html = browser.page_source
26 browser.quit()
27 return html
28
29
30 # 打开网页返回网页内容
31 def open_webpage(html):
32 reg = r"(http:\\\\S+(\\\\.jpg|\\\\.png|\\\\.gif))"
33 imgre = re.compile(reg)
34 imglist = re.findall(imgre, html)
35 return imglist
36
37
38 if __name__ == '__main__':
39 url = "http://jandan.net/ooxx/page-2#comments"
40 html = get_html3(url)
41 reg = r"(http:\\\\S+(\\\\.jpg|\\\\.png))"
42 imglist = re.findall(reg, html)
43 for img in imglist:
44 print(img[0]) /<code>
Python爬虫下载美女图片(不同网站不同方法)!全教给你。

香水有毒

  
  3. 下载图片 用上面提到过的urllib.request.Request方法就可以实现
  4. 测试都通过了,下面是汇总的完整源码OOXX_spider.py

Python爬虫下载美女图片(不同网站不同方法)!全教给你。

亚洲家庭肖像/孤立于白色

View Code
  
  5. 分析:用调用chrome方法速度会比较慢,不过这个方法会是反爬虫技术越来越先进的必然选择,如何提速才是要考虑的关键


五、其他直接贴完整代码(难度:??)
  1. 网址:http://pic.yesky.com yesky_spider.py

View Code
  
  2. 网站:http://www.7160.com 7160_spider

View Code
  3. 网站:http://www.263dm.com 263dm_spider.py

View Code
六、总结和补充
  1. 获取网页内容有三种方式
    urllib.request.Request和urllib.request.urlopen
    ——速度快,很容易被发现,不能获取js执行后的网页内容
    requests带headers的请求方法
    ——速度快,可以实现伪装,不能获取js执行后的网页内容
    chrome headless方法
    ——速度慢,等于浏览器访问,可以获取js执行后的网页内容


获取方式:转发+关注,私信小编“资料免费获取


分享到:


相關文章: