声明:以下代码,Python版本3.6完美运行
####思路介绍
- 浏览器浏览分析地址变化规律
- Python测试类获取网页内容,从而获取图片地址
- 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的内容
####完整代码:
from urllib import request
import re
from bs4 import BeautifulSoup
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def get_html(url):
req = request.Request(url)
return request.urlopen(req).read()
if __name__ == '__main__':
url = "https://www.dbmeinv.com/dbgroup/show.htm?cid=2&pager_offset=2"
html = get_html(url)
data = BeautifulSoup(html, "lxml")
print(data)
r = r'(https://\S+\.jpg)'
p = re.compile(r)
get_list = re.findall(p, str(data))
print(get_list)
通过urllib.request.Request(Url)请求网站,BeautifulSoup解析返回的二进制内容,re.findall()匹配图片地址
最终print(get_list)打印出了图片地址的一个列表
3. 通过python调用,下载图片,以下是Test_Down.py的内容
from urllib import request
def get_image(url):
req = request.Request(url)
get_img = request.urlopen(req).read()
with open('E:/Python_Doc/Images/DownTest/001.jpg', 'wb') as fp:
fp.write(get_img)
print("Download success!")
return
if __name__ == '__main__':
url = "https://ww2.sinaimg.cn/bmiddle/0060lm7Tgy1fn1cmtxkrcj30dw09a0u3.jpg"
get_image(url)
通过urllib.request.Request(image_url)获取图片,然后写入本地,看到路径下多了一张图片,说明整个爬虫实现是可实现的
######4. 综合上面分析,写出完整爬虫代码 douban_spider.py
from urllib import request
from urllib.request import urlopen
from bs4 import BeautifulSoup
import os
import time
import re
import threading
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
# 全局声明的可以写到配置文件,这里为了读者方便看,故只写在一个文件里面
# 图片地址
picpath = r'E:\Python_Doc\Images'
# 豆瓣地址
douban_url = "https://www.dbmeinv.com/dbgroup/show.htm?cid=%s&pager_offset=%s"
# 保存路径的文件夹,没有则自己创建文件夹,不能创建上级文件夹
def setpath(name):
path = os.path.join(picpath, name)
if not os.path.isdir(path):
os.mkdir(path)
return path
# 获取html内容
def get_html(url):
req = request.Request(url)
return request.urlopen(req).read()
# 获取图片地址
def get_ImageUrl(html):
data = BeautifulSoup(html, "lxml")
r = r'(https://\S+\.jpg)'
p = re.compile(r)
return re.findall(p, str(data))
# 保存图片
def save_image(savepath, url):
content = urlopen(url).read()
# url[-11:] 表示截取原图片后面11位
with open(savepath + '/' + url[-11:], 'wb') as code:
code.write(content)
def do_task(savepath, cid, index):
url = douban_url % (cid, index)
html = get_html(url)
image_list = get_ImageUrl(html)
# 此处判断其实意义不大,程序基本都是人手动终止的,因为图片你是下不完的
if not image_list:
print(u'已经全部抓取完毕')
return
# 实时查看,这个有必要
print("=============================================================================")
print(u'开始抓取Cid= %s 第 %s 页' % (cid, index))
for image in image_list:
save_image(savepath, image)
# 抓取下一页
do_task(savepath, cid, index+1)
if __name__ == '__main__':
# 文件名
filename = "DouBan"
filepath = setpath(filename)
# 2-胸 3-腿 4-脸 5-杂 6-臀 7-袜子
for i in range(2, 8):
do_task(filepath, i, 1)
# threads = []
# for i in range(2, 4):
# ti = threading.Thread(target=do_task, args=(filepath, i, 1, ))
# threads.append(ti)
# for t in threads:
# t.setDaemon(True)
# t.start()
# t.join()