飞道的博客

Python爬虫之爬取网站图片

459人阅读  评论(0)

暑假在家练科三的时候无聊突然想重拾Python,之前简单的学了学Python2的语法,但以后主流是Python3,就下了Python3,pycharm对着别人的教程试了试爬虫,我之前python2的时候爬虫主要用urllib,urllib2这两个,然后是通过正则匹配图片网址,此次python3主要用requests,解析图片网址主要用beautiful soup,几日下来算是可以基本完成爬取图片功能,写下了以便复习。

爬虫这个当然大多数人入门都是爬美女图片,我当然也不落俗套,首先也是随便找了个网址爬美女图片


  
  1. from bs4 import BeautifulSoup
  2. import requests
  3. if __name__== '__main__':
  4. url= 'http://www.27270.com/tag/649.html'
  5. headers = {
  6. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"}
  7. req = requests.get(url=url, headers=headers)
  8. req=requests.get(url=url,headers=headers)
  9. req.encoding = 'gb2312'
  10. html=req.text
  11. bf=BeautifulSoup(html, 'lxml')
  12. targets_url=bf.find( 'div',class_= 'w1200 oh').find_all( 'a',target= '_blank')
  13. for each in targets_url:
  14. img_req=requests.get(url=each.get( 'href'),headers=headers)
  15. img_req.encoding = 'gb2312'
  16. html = img_req.text
  17. bf = BeautifulSoup(html, 'lxml')
  18. img_url = bf.find( 'div', class_= 'articleV4Body').find( 'img')[ 'src']
  19. name=each.img.get( 'alt')+ '.jpg'
  20. path= r'C:\Users\asus\Desktop\新建文件夹'
  21. file_name = path + '\\' + name
  22. try:
  23. req1=requests.get(img_url,headers=headers)
  24. f=open(file_name, 'wb')
  25. f.write(req1.content)
  26. f.close()
  27. except:
  28. print( "some error")

期间遇到的一个情况是,它到访问img_url的时候总报错连接主机失败,我开始以为是网址加了反爬之类的,但是我单独拿出来一个网址,却可以很容易的访问,百思不得其解,最后咨询大佬告诉我把img_url的每一个都试试看,可能是某一个网址出了问题,找了找果然是有个叛徒,产生的img_url中第二个网址无法访问,怪不得老报错,我应该多试几个的,一叶障目

我同时也是个火影迷,掌握基本方法后准备试试爬取火影图片,也是网址找了个网址:

http://desk.zol.com.cn/dongman/huoyingrenzhe/

可以看到火影的图片是以图集的形式储存的,所以这个下载就比刚才的稍微多了一点步骤

查看网站源代码容易发现,图集的链接所在都是class='photo-list-padding'的li标签里,且链接没有补全

点开其中一个链接, http://desk.zol.com.cn/dongman/huoyingrenzhe/(前面为浏览器自动补全,在代码里需要自己补全)

可以看到图片的下载地址以及打开本图集下一张图片的链接

了解完网站的图片构造后动手写代码,我们筛选出图集的链接后,通过图集的链接找到第一张图片下载地址和第二张图片的链接,通过第二张的链接找到第二张的下载地址和第三张的链接,循环下去,直到本图集到底,接着开始第二个图集,直到所有图集下载完毕,代码如下,为了方便循环,我们集成下载图片功能为download函数,解析图片网址功能为parses_picture:


  
  1. from bs4 import BeautifulSoup
  2. import requests
  3. def download(img_url,headers,n):
  4. req = requests.get(img_url, headers=headers)
  5. name = '%s'%n+ '='+img_url[ -15:]
  6. path = r'C:\Users\asus\Desktop\火影壁纸1'
  7. file_name = path + '\\' + name
  8. f = open(file_name, 'wb')
  9. f.write(req.content)
  10. f.close
  11. def parses_picture(url,headers,n):
  12. url = r'http://desk.zol.com.cn/' + url
  13. img_req = requests.get(url, headers=headers)
  14. img_req.encoding = 'gb2312'
  15. html = img_req.text
  16. bf = BeautifulSoup(html, 'lxml')
  17. try:
  18. img_url = bf.find( 'div', class_= 'photo').find( 'img').get( 'src')
  19. download(img_url,headers,n)
  20. url1 = bf.find( 'div',id= 'photo-next').a.get( 'href')
  21. parses_picture(url1,headers,n)
  22. except:
  23. print( u'第%s图片集到头了'%n)
  24. if __name__== '__main__':
  25. url= 'http://desk.zol.com.cn/dongman/huoyingrenzhe/'
  26. headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"}
  27. req = requests.get(url=url, headers=headers)
  28. req=requests.get(url=url,headers=headers)
  29. req.encoding = 'gb2312'
  30. html=req.text
  31. bf=BeautifulSoup(html, 'lxml')
  32. targets_url=bf.find_all( 'li',class_= 'photo-list-padding')
  33. n= 1
  34. for each in targets_url:
  35. url = each.a.get( 'href')
  36. parses_picture(url,headers,n)
  37. n=n+ 1

期间遇到的一个情况是每次一个图集到底的时候,就会产生报错,因为找不到下一张图片的链接了,于是我便加上try语句来捕捉这一报错,让程序继续下去,有了bf果然比正则表达式简单,可以通过标签属性很方便的找到想要的信息。

下载情况:

 

 


转载:https://blog.csdn.net/qq_38412868/article/details/82080260
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场