新手完全参考了http://cuiqingcai.com/3179.html?from=singlemessage&isappinstalled=1,原版请移步查看,非常详细非常好。
我的第一个爬虫。一条条语句读懂了,并了解了运作的方式。仅做记录及日后翻查学习。
#导入需要的包
import requests
from bs4 import BeautifulSoup
import os
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}#设置浏览器请求头
one_url = 'http://www.mzitu.com/all'##开始的url地址
start_html = requests.get(one_url,headers=headers)##使用requests中的get方法获取all_url的内容,加上浏览器请求头
#print(start_html.text)
Soup = BeautifulSoup(start_html.text,'lxml')##用BeautifulSoup来解析获取到的网页文件,用lxml解析器
# li_list = Soup.find_all('li')
# # for li in li_list:
# # print(li)
all_span = Soup.find('div',class_='all').find_all('a')##用Soup对象的find方法找标签先查找class为all的div标签,然后查找所有<a>标签。find_all是查找所有<a>标签的意思,返回的是一个列表
for a in all_span:
# print(a)
title = a.get_text()##提取<a>标签内的文档
href = a['href']##提取<a>标签内的href属性,实际提取的是套图地址
# print(title,href)
html = requests.get(href,headers=headers)##使用requests中的get方法获取herf属性所指网页的内容,加上浏览器请求头
html_Soup = BeautifulSoup(html.text,'lxml')##用BeautifulSoup来解析获取到的网页文件,用lxml解析器
max_span = html_Soup.find('div',class_='pagenavi').find_all('span')[-2].get_text()##查找所有的<span>标签获取最后一个标签中的文本也就是最后一个页面了
for page in range(1,int(max_span)+1): ##用range产生页面序列
page_url = href + '/'+str(page)##手动拼接每一个页面地址
# print(page_url)
img_html = requests.get(page_url,headers=headers)##使用requests中的get方法获取herf属性所指网页的内容,加上浏览器请求头
img_Soup = BeautifulSoup(img_html.text,'lxml')##用BeautifulSoup来解析获取到的网页文件,用lxml解析器
img_url = img_Soup.find('div',class_='main-image').find('img')['src']##用img_Soup对象的find方法找标签先查找class为main-image的div标签,然后查找<img>标签里面的src。
# print(img_url)
#下面是建立保存图片
name = img_url[-9:-4]##取url的倒数第四至第九位做图片的名字
img = requests.get(img_url,headers=headers)##使用requests中的get方法获取所指网页的内容,加上浏览器请求头
f = open(name+'.jpg','ab')##写入多媒体文件必须要b这个参数
f.write(img.content)##多媒体文件要用conctent
f.close()
修改成函数后的代码:
#导入需要的包
import requests
from bs4 import BeautifulSoup
import os
#建立一个抓图类
class mzitu():
#主入口函数
def all_url(self,url):
html = self.request(url) ##调用request函数吧地址传进去,返回一个response
all_a = BeautifulSoup(html.text,'lxml').find('div',class_='all').find_all('a')##用Soup对象的find方法找标签先查找class为all的div标签,然后查找所有<a>标签。find_all是查找所有<a>标签
for a in all_a:
title = a.get_text()
print(u'开始保存:',title)##提示保存XXX
path = str(title).replace('?','_')##设置名字变量,将?替换成_
self.mkdir(path)##调用mkdir函数创建文件夹,path代表的是标题名
href = a['href']##取出<a>里面的href属性
self.html(href)##调用html函数吧href参数传递过去,href是套图的地址
#设置一个函数处理套图地址获得图片的页面地址
def html(self,href):
html = self.request(href)##调用request函数把套图地址传进去,返回一个response
max_span = BeautifulSoup(html.text,'lxml').find('div',class_='pagenavi').find_all('span')[-2].get_text()##查找所有的<span>标签获取最后一个标签中的文本也就是最后一个页面了
for page in range(1,int(max_span)+1):##用range产生页面序列
page_url = href + '/'+str(page)##手动拼接每一个页面地址
self.img(page_url)##调用img函数
#设置一个函数处理图片页面地址获得图片的实际地址
def img(self,page_url):
img_html = self.request(page_url)##调用request函数把图片页面地址传进去,返回一个response
img_url = BeautifulSoup(img_html.text,'lxml').find('div',class_='main-image').find('img')['src']##用img_Soup对象的find方法找标签先查找class为main-image的div标签,然后查找<img>标签里面的src。
self.save(img_url)##调用save函数保存图片,把img_url地址传递过去
#设置一个保存图片的函数
def save(self,img_url):
name = img_url[-9:-4]##取url的倒数第四至第九位做图片的名字
img = self.request(img_url)##调用request函数把图片地址传进去,返回一个response
f = open(name+'.jpg','ab')##写入多媒体文件必须要b这个参数
f.write(img.content)##多媒体文件要用conctent
f.close()##关闭文件对象
#创建一个函数用来创建文件夹
def mkdir(self,path):
path = path.strip() ##去除path前后空格
isExists = os.path.exists(os.path.join('F:\mzitu',path))##join将各部分合成一个路径名。os.path.exists判断后面的路径是否存在
if not isExists: ##如果为False,创建文件夹
print(u'创建了一个名字叫做',path,u'的文件夹!')
os.makedirs(os.path.join('F:\mzitu',path))##创建多层文件夹,用join合成单独的一个路径文件夹
os.chdir(os.path.join('F:\mzitu',path))##改变工作目录
return True
else:
print(u'名字叫做',path,u'的文件夹已经存在了!')
return False
#创建获取网页response的函数并返回
def request(self,url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}#设置浏览器请求头
content = requests.get(url,headers=headers) ##使用requests中的get方法获取页面的内容,加上浏览器请求头
return content
Mzitu = mzitu() ##实例化
#这就是入口!
Mzitu.all_url('http://www.mzitu.com/all')