小白爬虫3,爬取图片

今天来爬一爬图片

学习链接来自于
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’是什么作用还是未知。

最后计时,无所谓的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值