作为一个小小白,写一个小小小白能看得懂的教程!
这篇教程的终极目的是尽量做到让小小白看完了可以直接动手爬图片。
建议一边打开软件写代码,一边看文章,出了问题在文中找答案。干看文章不动手是没有任何效果的
1,准备工作
1.这个教程是基于Python3.6来的,我使用的是Anaconda3里的Spyder,如下图
个人感觉还可以。
2.然后是chrome浏览器,它右键菜单下有个检查,其实就是F12,可以在相应的位置查看网页的定义,非常方便。
3.在开始之前,可以先看一下这个博客: 小白爬虫第一弹之抓取妹子图 | 静觅
这篇文章给了我很大帮助,致敬哎哟卧槽!
2,开始上手
别问我为啥不爬妹子图,网上爬妹子图的教程实在太多了!
当然,好好看懂这篇教程之后,爬妹子图就完全不在话下了
好,砸门先看一下这个网址的主页。
从网站页面上来看,壁纸在主页有好几个分类,什么最新啊精美啊热门啊...
这次呢,以最新壁纸为例
爬取的思路是:步骤一:获得最新壁纸这个大分类中的每个主题的网址
步骤二:获得主题中图片的网址
步骤三:获得图片的大图地址
步骤四:保存图片,over
先贴上所有代码,后面会一步步解释。
from bs4 import BeautifulSoup
import requests
import os
url = 'http://www.zhuoku.com/'
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}
url_get = requests.get(url,headers = header)
url_decode = url_get.content.decode("gb2312","ignore").encode("utf-8","ignore") #gb2312为网页编码
url_soup = BeautifulSoup(url_decode,'html.parser')
all_a = url_soup.find('div',id="zuixin").find_all('a',attrs={"class":"title"}) #此处attrs={"class":"title"}必须为大括号
for a in all_a:
title = a.get_text().replace('/','') #取得标签中的text
href = a.get('href') #取得标签中的href
img_url = url + href[1:-4] + '(1).htm' #补全herf
if os.path.isdir(os.path.join("D:\zhuoku",title)): #如果存在文件夹
print('exist ' + title)
pass #跳过
else: #否则
os.makedirs(os.path.join("D:\zhuoku",title)) #创建文件夹
print('makedir ' + title)
os.chdir("D:\zhuoku\\"+title) #切换到此文件夹
img_url_get = requests.get(img_url,headers = header)
img_url_soup = BeautifulSoup(img_url_get.text,'html.parser')
max_img_page = img_url_soup.find('div',id="yema").find_all('a')[-1].get_text() #[-1]表示find_all('a')中的最后一个
for page in range(1, int(max_img_page)+1):
jpg_href = url + href[1:-4] + '(' + str(page) + ').htm' + '#turn' #jpg网址
jpg_href_get = requests.get(jpg_href,headers = header)
jpg_soup = BeautifulSoup(jpg_href_get.text,'html.parser')
jpg_url = jpg_soup.find('div',id="bizhiimg").find('img')['src'] #jpg网址中的图片文件地址
name = jpg_url[-9:] #截取图片文件地址的倒数第9位至末尾为图片的名字
if os.path.isfile(name): #如果存在名为name的文件
print(name + ' exist skip')
pass #下面全跳过
else: #否则
jpg_header = {
'Referer':jpg_href,
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'
}
jpg = requests.get(jpg_url,headers = jpg_header) #jpg文件地址解析
f = open(name, 'ab')
f.write(jpg.content)
print(name + ' saved')
f.close()
print('congratulations! all finished!')
2.1,实现步骤一
2.1.2,获得网页源代码
代码如下
from bs4 import BeautifulSoup
import requests
import os
url = 'http://www.zhuoku.com/' #网址记得一定要加''号
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'}
url_get = requests.get(url,headers = header)
代码解释,import部分:
requests模块,我们这次需要用到它来获取网页的源代码。
BeautifulSoup模块是一个可以从网页上提取数据的Python库,它包括在bs4模块中,所以写为 from bs4 import BeautifulSoup
os模块用来保存获取到的图片,后面需要用到。
这三个模块都已经包含在Anaconda3软件中了,不需要自己另外安装。
Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。
其实最开始的几行也可以写成上图所示,在不加headers的情况下可以打开这个网址的主页,但是在很多其他的网站,没有headers的请求它就不给你返回数据,所以在这一步一般习惯上都加上了headers
上图第6行url_get 这一步,便是获取网页了。
当然,第5/6行的url,url_get,这几个字母只是我个人喜欢写成这样子,你可以按你喜好改
第7行print()便是输出括号中的结果,结果显示在右边。
但是后面为什么要加个.text呢,因为如果不加,显示的则是下图这样
输出的结果是
这代表http请求正确的响应了,给你返回的一个状态码,但想要查看返回的网页源代码就得加.text
ok,成功获得网页源代码
2.1.2获得主题名称和主题网址。
在最新壁纸下的主题右键,检查。
可以看出,最新壁纸这个分类在一个id="zuixin"的
壁纸主题在
而我们需要的主题网址和主题名称就包含在第二个