今天来爬一爬图片
学习链接来自于
https://www.jqhtml.com/13393.html
爬的图片
http://i.jandan.net/ooxx
中的1-33页
现在看1-33页的表达方式
http://jandan.net/ooxx/ page-32
仅仅只是page-32 这一块变了,所以目的很明确,for循环一下就好了
但是不可能每次爬虫都看一下有几页,所以要他自动抓取
对着 33按钮 右键检查,就可以看到
<span class="current-comment-page">[33]</span>
抓出出来就好了
all_page = soup.find('span',class_='current-comment-page').get_text()[1:-1]
注意find函数里头加 ’ ’ ,class要加_,get_text()中间是_。 [1:-1]的意思是去掉首尾,因为获取的是[33]
获取图片URL
用的是CSS的select方法,就是在图片html中 右键 COPY——COPY Select,之后只需要父级标识就够了
#comment-4222073 > div > div > div.text > p > img
只需要
div.text > p > img
之后调用CSS,把图片URL选择出来
allimages = soup.select('div.text > p > img')
所以在allimages中就是我们所有的图片URL地址了
最后在把URL地址补全http:
img_url = []
for img in allimages:
urls = img['src']
if urls[0:5]=='http:':
img_url=urls
else:
urls = 'http:' + urls
img_url=urls
图片的URL地址的收集任务完成!
接着是下载
def dowmload(list):
for img in list:
urls = img['src']
if urls[0:5]=='http:':
img_url = urls
else:
img_url = 'http:' + urls
filename = img_url.split('/')[-1]
with open(filename,'wb') as f:
#获取图片是获取它的content参数,不是text
try:
f.write(get_html(img_url).content) #get_html(img_url) = resp 所以还是resp.content
print('Sucessful images:',filename)
except:
print('fail:',filename)
list 是页码的表格,
urls = img[‘src’]代表了每个图片的URL地址,在这里面把地址补全,
filename = img_url.split(’/’)[-1]代表着把地址 / 的后面留下,其他去除
所以有了对应页码的文件名,里面放着图片
再加个计时器计算时间:
if __name__=='__main__':
t1 = time.time()
代码区
print(time.time()-t1)
源码如下:
import requests
import os
from bs4 import BeautifulSoup
import time
#获取urlist(即 几页到几页 的url地址)
def get_html(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}
proxies = {'http':'171.41.84.203'}
try:
resp = requests.get(url,headers=headers)
except:
resp = requests.get(url,headers=headers,proxies=proxies)
return resp
#获取所有页码
def all_page():
base_url = 'http://jandan.net/ooxx/'
urllist = []
soup = BeautifulSoup(get_html(base_url).text,'lxml')
#获取页数
all_page = soup.find('span',class_='current-comment-page').get_text()[1:-1]
for page in range(1,int(all_page)+1):
allurl = base_url + 'page-' + str(page)
urllist.append(allurl)
return urllist
# 创建文件夹的函数,保存到D盘
def mkdir(path):
# os.path.exists(name)判断是否存在路径
# os.path.join(path, name)连接目录与文件名
isExists = os.path.exists(os.path.join("E:\爬虫\jiandan",path))
if not isExists:
print('makedir',path)
# 创建文件夹
os.makedirs(os.path.join("E:\爬虫\jiandan",path))
# 切换到创建的文件夹
os.chdir(os.path.join("E:\爬虫\jiandan",path))
return True
else:
print(path,'already exists')
return False
#获取图片地址并下载
def get_imgs():
list = all_page()
for url in list:
#以 - 为分割,保留后面的,即第几页,
path = url.split('-')[-1]
#创建文件夹,每个文件夹存放相对应页码的图片
mkdir(path)
#获得HTEML源码
html =get_html(url).text
#解析
soup = BeautifulSoup(html,'lxml')
#CSS 寻找要下载的图片URL
allimages = soup.select('div.text > p > img')
#dowmload
dowmload(allimages)
print('OK')
#下载功能
def dowmload(list):
for img in list:
urls = img['src']
if urls[0:5]=='http:':
img_url = urls
else:
img_url = 'http:' + urls
filename = img_url.split('/')[-1]
with open(filename,'wb') as f:
#获取图片是获取它的content参数,不是text
try:
f.write(get_html(img_url).content) #get_html(img_url) = resp 所以还是resp.content
print('Sucessful images:',filename)
except:
print('fail:',filename)
#计时
if __name__=='__main__':
t1 = time.time()
get_imgs()
print(time.time()-t1)
总结一下
爬取图片的步骤:
①②③④⑤⑥⑦⑧⑨
①
找到要爬虫的图片的最原始网站样式,例如这次的http://jandan.net/ooxx/
②
获取该页的HTML(记得加代理跟headers),接着利用BeautifulSoup和lxml解析得到soup,同时得到最大页数(利用右键检查的方式),最后找到规律,将所有要爬取得url利用for循环得到一个List。
③
采集当前页数,把页数作为path,进而创建每页单独的文件夹(mkdir(path))
isExists = os.path.exists(os.path.join("E:\爬虫\jiandan",path))
if not isExists:
print('makedir',path)
# 创建文件夹
os.makedirs(os.path.join("E:\爬虫\jiandan",path))
# 切换到创建的文件夹
os.chdir(os.path.join("E:\爬虫\jiandan",path))
return True
else:
print(path,'already exists')
return False
④
获取当前页码所有图片的图片URL,即利用CSS选择器选取soup里头的图片地址,所有图片地址保存在一个叫做 allimages列表中。
allimages = soup.select('div.text > p > img')
⑤
下载,第一步是提取图片URL能下载的链接,即只有 urls = img[‘src’] src后面的部分才能当作下载链接。
第二步是补齐http:
第三步是给他命名
filename = img_url.split('/')[-1]
最后把它存入文件夹,当然了resp.content参数是最重要的。
with open(filename,'wb') as f:
try:
f.write(get_html(img_url).content) #get_html(img_url) = resp 所以还是resp.content
print('Sucessful images:',filename)
except:
print('fail:',filename)
‘wb’是什么作用还是未知。
⑦
最后计时,无所谓的。