声明:以下代码,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的内容 
####完整代码:

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()

本文转载:CSDN博客