python爬虫简易到进阶实战篇——(4)
python简易实战(4)——明星写真图片爬取
这一章将继承上一章对网页图片的获取
将对实例进行操作
操作之前,我们先要找到自己想要获取内容的网页,我在网上看到了一些爬取妹子图的,本着纯洁教学的心理,我并没有爬取这个,而是选择了某个明星写真网站,网址http://www.mingxing.com/tuku/index?&p=1,然后对其分析。
首先,我们需要通过原网页获取一些子网址,很明显,我们要获取的不仅仅是单独的一张图片,而是要通过点击网页链接而获取这一系列的图片。
因此,我们先解析网页,透过开发者工具定位第一张图片
可以看出在jpg格式上方有一个.html的一段字符,通过对比子网页我们可以知道这就是子网页的部分url,我们对其进行提取并拼接,就获取到了子网页的url。
进入子网页后通过开发者工具定位大图发现:
通过代码:
imgurl = soup.find_all('img',alt='')
我们发现提取到了不止我们想要的图片链接,所以我们还要对其进行清洗,用到了正则表达式。我发现只要是网页中的图片,它的图片url都会有2018这串数字,于是我用正则表达式尝试匹配了一下:
for imgurl in imgurl:
try:
imgurl1 = re.findall('.*2018.*',imgurl['src'])[0]
except:
None
之后发现实现了,但是还是有一个弊端,就是没有去掉重复的url。
因为这两张图片的url完全一样,但是因为之后网页处理后得到的图片和名称是一样的,所以会自动替换,我就没有再处理。
下面将给出源代码,并给予注释:
#__author:'lwq'
#date: 2018/8/23
import re
import requests
from bs4 import BeautifulSoup
import os
try:#创建新文件夹,如果存在就跳过
os.makedirs('D://python作业//two')
except:
None
def getHtml(url):#请求网页并返回Beautifulsoup后的文本
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
return soup
def getHtml1(url):#请求网页并返回二进制文本
response = requests.get(url)
html = response.content
return html
def getImg(soup):#对网页返回的Beautifulsoup进行解析,该处是原网页的解析,得到子网页残缺url,以数组形式存储并返回
imglist = []
imgurl = soup.find_all('a')
for imgurl in imgurl:
try:
urlone = re.findall('.*\d{6}.*', imgurl['href'])[0]
imglist.append(urlone)
except:
None
return imglist
def getImgurl(soup):#对网页返回的Beautifulsoup进行解析,该处是子网页的解析,第一个值返回即将创建的文件名,之后为相应的图片url,并以数组形式存储返回
lis = []
try:
imgurl = soup.find_all('img',alt='')
title = soup.find('h1').text[:-5]
lis.append(title)
except:
None
for imgurl in imgurl:
try:
imgurl1 = re.findall('.*2018.*',imgurl['src'])[0]
lis.append(imgurl1)
except:
None
return lis
def Write(title,img,content):#将内容写进文本,title为创建的子目录,img为写入的图片名字,content为写入的内容
try:
os.makedirs('D:/python作业/two/%s/'%title)
except:
None
with open('D:/python作业/two/%s/'%title+'%s'%img,'ab') as fb:
fb.write(content)
fb.close()
if __name__ == '__main__':
for i in range(1,1576):#循环1576页,因为第1页和第0页内容一样,就省去。
url = 'http://www.mingxing.com/tuku/index?&p=%s'%i
print('第'+str(i)+'页')
soup =getHtml(url)
for urlone in getImg(soup):
urltwo = 'http://www.mingxing.com%s' % urlone
soup1 = getHtml(urltwo)
for urlimg in getImgurl(soup1)[1:]:
title = getImgurl(soup1)[0]#获取子目录的名称
try:
print(urlimg)
content = getHtml1(urlimg)
print(content)
Write(title, urlimg[-20:], content)#这里图片名称写入http会报错,所以提取后20个字符为名称,恰好还有图片格式。
except Exception as e:
print(e)
因为数据太大,可能要运行很久,之后会学习到爬虫框架,它适合爬取这种大量的数据,比我们这样快了几倍。
等我熟悉了以后再进一步扩展。
可能上面会有某个库的使用不是很适当,有建议可以提出来,我也会尽量改进。
接着给大家看看部分结果图:
可以看到文件的数量,而且这还没有运行完。
也有可能这数量太多,有些人可能认为没什么用,但我只是教一下大家用法,具体怎么用,还有因时而动。
上一篇: PHP的应用——聊天室开发完全手册(三)
下一篇: 牛客-紫魔法师(仙人掌染色-判奇环)