声明:以下代码,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的内容
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)
通过urllib.request.Request(Url)请求网站,BeautifulSoup解析返回的二进制内容,re.findall()匹配图片地址
最终print(get_list)打印出了图片地址的一个列表
3. 通过python调用,下载图片,以下是Test_Down.py的内容
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)
通过urllib.request.Request(image_url)获取图片,然后写入本地,看到路径下多了一张图片,说明整个爬虫实现是可实现的
4. 综合上面分析,写出完整爬虫代码 douban_spider.py
1 from urllib import request 2 from urllib.request import urlopen 3 from bs4 import BeautifulSoup 4 import os 5 import time 6 import re 7 8 9 # 全局声明的可以写到配置文件,这里为了读者方便看,故只写在一个文件里面 10 # 图片地址 11 picpath = r‘E:\Python_Doc\Images‘ 12 # 豆瓣地址 13 douban_url = "https://www.dbmeinv.com/dbgroup/show.htm?cid=%s&pager_offset=%s" 14 15 16 # 保存路径的文件夹,没有则自己创建文件夹,不能创建上级文件夹 17 def setpath(name): 18 path = os.path.join(picpath, name) 19 if not os.path.isdir(path): 20 os.mkdir(path) 21 return path 22 23 24 # 获取html内容 25 def get_html(url): 26 req = request.Request(url) 27 return request.urlopen(req).read() 28 29 30 # 获取图片地址 31 def get_ImageUrl(html): 32 data = BeautifulSoup(html, "lxml") 33 r = r‘(https://\S+\.jpg)‘ 34 p = re.compile(r) 35 return re.findall(p, str(data)) 36 37 38 # 保存图片 39 def save_image(savepath, url): 40 content = urlopen(url).read() 41 # url[-11:] 表示截取原图片后面11位 42 with open(savepath + ‘/‘ + url[-11:], ‘wb‘) as code: 43 code.write(content) 44 45 46 def do_task(savepath, cid, index): 47 url = douban_url % (cid, index) 48 html = get_html(url) 49 image_list = get_ImageUrl(html) 50 # 此处判断其实意义不大,程序基本都是人手动终止的,因为图片你是下不完的 51 if not image_list: 52 print(u‘已经全部抓取完毕‘) 53 return 54 # 实时查看,这个有必要 55 print("=============================================================================") 56 print(u‘开始抓取Cid= %s 第 %s 页‘ % (cid, index)) 57 for image in image_list: 58 save_image(savepath, image) 59 # 抓取下一页 60 do_task(savepath, cid, index+1) 61 62 63 if __name__ == ‘__main__‘: 64 # 文件名 65 filename = "DouBan3" 66 filepath = setpath(filename) 67 68 # 2-胸 3-腿 4-脸 5-杂 6-臀 7-袜子 69 for i in range(2, 8): 70 do_task(filepath, i, 1)
运行程序,进入文件夹查看,图片已经不停的写入电脑了!
5. 分析:豆瓣图片下载用比较简单的爬虫就能实现,网站唯一的控制好像只有不能频繁调用,所以豆瓣不适合用多线程调用
豆瓣还有一个地址:https://www.dbmeinv.com/dbgroup/current.htm有兴趣的小朋友可以自己去研究
三、MM131网(难度:??)
1. 网址:http://www.mm131.com
待完善......
四、煎蛋网(难度:??)
1. 网址:http://jandan.net/ooxx
待完善......
五、天极图片(难度:??)
1. 网址:http://pic.yesky.com
待完善......
六、总结和补充
1. 获取网页内容有三种方式
urllib.request.Request和urllib.request.urlopen
——速度快,很容易被发现,不能获取js执行后的网页内容
requests带headers的请求方法
——速度快,可以实现伪装,不能获取js执行后的网页内容
chrome headless方法
——速度慢,等于浏览器访问,可以获取js执行后的网页内容