python爬取网站美女图(附代码及教程)爬虫爬取海量手机壁纸,电脑壁纸,美女图片,风景图片等
想要练习爬虫的兄弟们,可以看看这个如果大神们看到有哪里可以改进的地方,请告诉小弟,我是个纯纯新手,练习了几次爬虫以前一直用的BeautifulSoup,一直没有接触过正则表达式正则表达式是一个非常好用、实用的东西,在这里也稍微练习一下(我就是研究正则表达式的时候跑偏了,爬取了各个网站的妹子图)为了得到进一步的练习,这里再加入多线程爬取,提高下载速度的同时,又练习了一个新知识开始今天爬取的是挖好图(
想要练习爬虫的兄弟们,可以看看这个
如果大神们看到有哪里可以改进的地方,请告诉小弟,我是个纯纯新手,练习了几次爬虫
以前一直用的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秒左右,可以下载完全部
事后,可以更换该网站其他类目的链接,下载其他类型的图片
以上内容欢迎大神指正
更多推荐
所有评论(0)