这次用正则表达式练练手,正则表达式网上有很多在线测试的工具,倒是xpath很少基本没有真正的在线测试。上期做过xpath解析,这次用正则表达式来搜索。中途不懂就查正则表达式的例子看。这次爬的是彼岸图网的4k动漫壁纸,原理也很简单,毕竟是静态网页来的,html中就有想要的图片链接。就是要点进每个图片中才有大图的链接,否则是类似缩略图是小的。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import re
import os
def getHTMLText(url, num):
text = []
r = requests.get('http://pic.netbian.com/4kdongman/index.html', timeout=30)
r.raise_for_status()
text.append(r.text)
for i in range(2, num):
u = url + str(i) + '.html'
text.append(getHTML(u))
return text
# 返回htmlText的接口
def getHTML(url):
r = requests.get(url, timeout=30)
r.raise_for_status()
return r.text
# 第一层解析 : tupian/8888.html
def parseHTML(text):
tupian = []
for t in text:
try:
ids = re.findall(r'/tupian/[\d]*.html', t)
tupian.append(ids)
except:
continue
return tupian
# 第二层解析
def parseHTML2(url2, tupian):
imgList = []
for i in tupian:
for j in i:
u = url2 + j
text = getHTML(u)
try:
img = re.findall(r'id="img"><img src="/uploads/allimg/.*?.jpg', text)[0].split("allimg")[-1]
imgList.append(img)
except:
continue
return imgList
def downloadImg(imgList):
if not os.path.exists('彼岸图网4k动漫壁纸'):
os.mkdir('彼岸图网4k动漫壁纸')
else:
pass
os.chdir('彼岸图网4k动漫壁纸')
num = 1
for img in imgList:
resub = re.sub('/', '_', img)
if os.path.exists(resub):
print('已存在壁纸 {}'.format(resub))
else:
content = requests.get('http://pic.netbian.com/uploads/allimg' + img).content
with open(resub, 'wb') as f:
print('正在下载第{}张: {}'.format(num, img))
f.write(content)
num += 1
print(num - 1, '张图片下载成功!')
def main():
num = 1
url = 'http://pic.netbian.com/4kdongman/index_'
url2 = 'http://pic.netbian.com'
text = getHTMLText(url, num)
tupian = parseHTML(text)
imgList = parseHTML2(url2, tupian)
downloadImg(imgList)
# print(imgList)
main()
这次的代码是早弄好的,没有像上期的xpath解析那样认真检查,毕竟上期可是福利来的哈哈?。
利用正则表达式re的findall方法,怕表达式写错提取不出想要的可以到在线测试工具测试,这次依然要注意文件夹名称不能有非法字符,可以用正则表达式的sub函数来替换字符。
不懂可问,不好可点。
虽然是很小白的代码,为了丰富csdn小的也写进去吧,或者csdn就放这些小程序好啦。