想要练习爬虫的兄弟们,可以看看这个

如果大神们看到有哪里可以改进的地方,请告诉小弟,我是个纯纯新手,练习了几次爬虫

以前一直用的BeautifulSoup,一直没有接触过正则表达式

正则表达式是一个非常好用、实用的东西,在这里也稍微练习一下(我就是研究正则表达式的时候跑偏了,爬取了各个网站的妹子图)

为了得到进一步的练习,这里再加入多线程爬取,提高下载速度的同时,又练习了一个新知识

开始

今天爬取的是挖好图(https://www.wahaotu.com/),这个网站中的妹子图,你也可以爬取该网站的任何其他类型图片,放几个图片展示一下

首先,打开网站,随便选择其中一个类别,这里以美女图片为例

我们要做的就是爬取这个美女图片这一栏下的所有图片,要打开每个相册,下载其中的每个高清大图

:代码如下

home_page = 'https://www.wahaotu.com/meinv/list_1.html'
home_page_res = requests.get(home_page, headers={'User-Agent': str(UserAgent().random)})
home_page_res.encoding = 'utf-8'
home_html = home_page_res.text
pic_page = re.findall('<a href="(.*?)" title="(.*?)" target="_blank">', home_html)
for url in pic_page:
    headers = {'User-Agent': str(UserAgent().random)}
    res = requests.get(url[0], headers=headers)
    picAlt = url[1]
    print('正在获取链接: ' + picAlt)#为了好看,随便输出一点
    html = res.text
    pics = re.findall('<p style="text-align: center;"><img src="(.*?)" alt=".*?"/></p>', html)
    for i in pics:
        i = 'https://www.wahaotu.com' + i  # 链接
        k = './img/' + picAlt + '/' + str(i[-20:])  # 名称
        pic_urls[i] = k # 在这里,将链接和名称用字典的形式保存起来,留作备用,一会儿要创建文件夹,如果不创建,则不用处理这里

到这里,获得了该页面的所有相册的内部的每张高清图片的图片链接(目前只是第一页)

下一步开始下载图片,代码如下:

response = requests.get(url,headers = {'User-Agent': str(UserAgent().random)})
if response.status_code == 200: #这里可以不管,这是之前别爬取别的网站试的
    img = response.content #获取图片内容
    path = pic_urls[url][:-20] #找到文件夹,如果没有则创建
    if not os.path.exists(path):
        os.makedirs(path)
    with open(pic_urls[url], 'wb') as f:# 写入图片,也就是下载图片
        f.write(img)

到这里,将本页面所有的相册中的所有图片,就全部下载到本地了,并且按照文件夹整理好了,你也可以不设置文件夹,全部弄到一个文件夹

然后稍微改一下,爬取5页的所有,目前只有5页

再然后,因为爬取的东西太多,所以采用Queue,异步抓取,多线程爬取,可以同时下载多个,这将超大幅提高下载速度

完整代码如下:

from fake_useragent import UserAgent
import requests
import re
from gevent import monkey
import os
import urllib
import gevent, time
from gevent.queue import Queue
monkey.patch_all()

def GetPicLink():
    pic_urls = {}
    for i in range(1, 6):
        print('开始获取第{}页的主页'.format(i))
        home_page = 'https://www.wahaotu.com/meinv/list_{}.html'.format(i)
        home_page_res = requests.get(home_page, headers={'User-Agent': str(UserAgent().random)})
        home_page_res.encoding = 'utf-8'
        home_html = home_page_res.text
        pic_page = re.findall('<a href="(.*?)" title="(.*?)" target="_blank">',home_html)
        for url in pic_page:
            headers = {'User-Agent': str(UserAgent().random)}
            res = requests.get(url[0],headers=headers)
            picAlt = url[1]
            print('正在获取链接: '+picAlt)
            html = res.text
            pics = re.findall('<p style="text-align: center;"><img src="(.*?)" alt=".*?"/></p>',html)
            for i in pics:
                i = 'https://www.wahaotu.com'+i#链接
                k = './img/' + picAlt + '/'+str(i[-20:])#名称
                pic_urls[i] = k
    return pic_urls


pic_urls = GetPicLink()

work = Queue()
for u in pic_urls.keys():
    work.put_nowait(u)

def crawler():
    global pic_urls
    while not work.empty():
        url = work.get_nowait()
        response = requests.get(url,headers = {'User-Agent': str(UserAgent().random)})
        if response.status_code == 200:
            img = response.content
            #print('\r正在下载' + str(url), end='')
            # 将他拷贝到本地文件 w 写  b 二进制  wb代表写入二进制文本
            path = pic_urls[url][:-20]
            if not os.path.exists(path):
                os.makedirs(path)
            with open(pic_urls[url], 'wb') as f:
                f.write(img)

task_list = []
for x in range(9):
    task = gevent.spawn(crawler)
    task_list.append(task)


start = time.time()
gevent.joinall(task_list)
end = time.time()-start
print(end)

坐等下载完成,大约150秒左右,可以下载完全部

事后,可以更换该网站其他类目的链接,下载其他类型的图片

以上内容欢迎大神指正

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐