简单爬虫来爬取网站图片:
就要先"踩点",即熟悉爬取网站html源代码的规律,筛选我们出需要的标签和url(字符串筛选可以,但是正则表达式更方便,我也只学了一点。)
然后便是urllib.request的基本操作了:
urlopen(url)返回response
然后open(path, 'wb')创建文件二进制写入图片即可。
整体还是很考察细节和思路的。我的整体模板写的太差了,思路不清晰。
import urllib.request as urlreq
import re
import os
def open_url(url):
headers = {
#记得加入Referer,对付”反盗链”的方式,只加User-Agent还是会出现403
'Referer':'https://www.mzitu.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36'
}
req = urlreq.Request(url, headers = headers)
resp = urlreq.urlopen(req)
html = resp.read()
return html
#获取返回封面图片链接,链接,封面名形成的列表
def get_cover_href(html):
list1 = re.findall(r'href="(.*?)".*?data-original=(\'.*?\').*?alt=(\'.*?\')', html)
return list1
#获取套图每页图的地址
def find_img(html):
src = re.findall(r'<img src="(.*?.jpg)"',html)
return src[0]
#保存图片
def download_img(url):
img = open_url(url)
filename = url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(img)
#下载每个封面里的内容
def download_onepage(url):
html = open_url(url).decode('utf-8')
list1 = re.findall(r'href="(.*?)".*?s', html)
list1 = re.findall(r'<a href=.*?<span>(\d\d|\d)</span>', html)
#注意list1内元素为字符串,要先全部转换为int再max取最大值
list1 = list(map(lambda n:int(n), list1))
max_page = max(list1)
#进入每个页数保存对应图片
for i in range(1,max_page+1):
t_url = url + '/' + str(i)
html = open_url(t_url).decode('utf-8')
img_url = find_img(html)
download_img(img_url)
def save(list1):
os.chdir('F:/桌面/test/ooxx')
for each in list1:
#创建每个封面的文件夹
url = each[1][1:-1]
try:
os.mkdir(each[2][1:-1])
os.chdir(each[2][1:-1])
download_img(url)
print('图组:%s ing...' % (each[2][1:-1]))
#下载每个封面里的内容
download_onepage(each[0])
except OSError as e:
print('%s : 已被创建' % (each[2][1:-1]))
continue
else:
os.chdir('..')
def download_mm():
url = 'https://www.mzitu.com/hot/'
html = open_url(url).decode('utf-8')
list1 = get_cover_href(html)
save(list1)
if __name__ == '__main__':
download_mm()
咳咳,成品还是不错的,一张没有少。自己改一下保存路径便可以运行代码。