这次要爬取的是一个壁纸网站wallhaven,里面有很多用户上传的高清壁纸分享。点击进去会出现一个搜索页面,输入dota2,这就得到了我们要爬取的第一个url:”https://alpha.wallhaven.cc/search?q=dota2&search_image=&“。没错,今天的任务是爬取的是上面dota2专题的所有高清壁纸。
  点进页面之后照常往下拉,想看看是否有那种点击翻页之类的东西:
  
  这就懵逼了呀!难道这是遇上了号称最难爬取的动态加载页面???
  别着急,慢慢来。。。突然我发现上面的url好像变了:
  
  这样我们得到了第二页的url:”https://alpha.wallhaven.cc/search?q=dota2&search_image=&page=2“。与第一个url进行比较,可以大胆猜测第3页url是后面加个”page=3”。这样的话只要通过字符串处理函数,就能得到dota2专题的所有url。问题是最后一个url是啥呢?
  
  从这里可以看出最后一个url是”page=34”,我们也可以通过抓取来得到这个信息。我们也可以先不抓取,直接拿34这个结果来使用。
  从第一页开始,我们先获取图片所在的url。右键直接查看元素:
  
  那个”<>”就表示标签的意思,结果发现url就在a标签下的href属性内。用BeautifulSoup库直接就可以做到这一点,具体可参照官方文档点这里。话不多说,先上代码:

import requests
from bs4 import BeautifulSoupurl = 'https://alpha.wallhaven.cc/search?q=dota2&search_image=&'
# dota2专题的urlreq = requests.get(url)
# 获得一个response对象html = req.content
# 获得界面内容part_list = soup.find('section',class_='thumb-listing-page').find('ul').find_all('a',class_='preview')
# 找到所有a属性的列表for part in part_list:# 循环遍历列表中的a属性print(part['href'])# 打印出href属性

  requests库提供一个get方法用于获取url界面。具体可参照官方文档点这里。
  这样,一个简单的爬取图片所在url的功能就实现了。接下来再爬取图片的url。一样的步骤,先查看元素:
  
  发现图片链接就在img标签的src属性。可以通过BeautifulSoup简单实现:

import requests
from bs4 import BeautifulSoupurl = 'https://alpha.wallhaven.cc/wallpaper/543780'
# 要爬取图片所在的链接req = requests.get(url)
# 获得response对象html = req.content
# 获取界面内容img_soup = BeautifulSoup(html,'lxml')
# 将界面用lxml解码并转换为BeautifulSoup对象img = img_soup.find('main').find('section',id='showcase').img['src']
# 找到img标签下的src属性img_url = 'https:' +imgprint(img_url)
# 经过加工得到图片真正的url

  需要注意这里我们获得了图片所在地址的真实url,只要访问这个url,里面的内容就是以二进制形式存储的图片内容。将这个二进制数据写入文件就得到了图片。分析就到这里,代码如下:

import requests
from bs4 import BeautifulSoup
import timeclass WHavenSpider:"""用于爬取WallHaven高清壁纸"""def __init__(self,topic_url):"""初始化抓取的主题url"""self.topic_url = topic_urldef getHtml(self,url):"""输入url输出页面内容"""req = requests.get(url)# 获取url网页html = req.content# 网页内容return htmldef selectPartlist(self,html):"""输入页面删选出包含url部分的列表"""soup = BeautifulSoup(html,'lxml')part_list = soup.find('section',class_='thumb-listing-page').find("ul").find_all('a',class_='preview')return part_listdef selectImg(self,img_html):"""输入页面删选出图片url"""img_soup = BeautifulSoup(img_html,'lxml')# 对页面进行处理img = img_soup.find('main').find('section',id='showcase').find("img")['src']# 找出高清图片网址img_url = 'https:' + img# 加上前缀return img_urldef download(self,name,pic_html):"""下载图片"""f = open("/home/username/Documents/DotaImg/"+name,'wb')# 下载目录f.write(pic_html)f.closedef work(self):"""工作方法"""topic_html = self.getHtml(self.topic_url)for url in self.getTopic(topic_html):html = self.getHtml(url)part_list = self.selectPartlist(html)for part in part_list:page_url = part['href']page_html = self.getHtml(page_url)img_url = self.selectImg(page_html)       name = img_url[-10:]img_html = self.getHtml(img_url)self.download(name,img_html)print("==========%s图片下载完毕=========="%name)print("==========第%s页下载完毕=========="%url.rpartition('=')[-1])def getTopic(self,topic_html):"""输入专题页面得到专题所有页面的url,返回一个迭代器对象"""topic_soup = BeautifulSoup(topic_html,'lxml')num_generator = topic_soup.h2.strings# h2节点下的多个内容,为'generator'不能通过下标遍历num_list = list(num_generator)num = num_list[-1].split(' ')[-1]for i in range(1,int(num)):"""循环迭代产生出url"""topic_url = self.topic_url + 'page=' + str(i)yield topic_urlurl = "https://alpha.wallhaven.cc/search?q=dota2&search_image=&"
# dota2专题首页urldotaspider = WHavenSpider(url)
dotaspider.work()

  运行之后的效果如下:
  

Python爬虫笔记之用BeautifulSoup及requests库爬取相关推荐

  1. python爬虫实战之图灵社区图书信息的爬取(找了久,才找到一个比较好爬取的网站)

    python爬虫实战之图灵社区图书信息的爬取 程序的描述 目标 获取图灵社区(https://www.ituring.com.cn/book)中40本图书的书名 将获取的信息以列表的形式输出到屏幕上, ...

  2. Python爬虫新手入门教学(十):爬取彼岸4K超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  3. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  4. Python爬虫新手入门教学(十七):爬取yy全站小视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  5. python获取网页json返回空_Python用requests库爬取返回为空的解决办法

    首先介紹一下我們用360搜索派取城市排名前20. 我们爬取的网址:https://baike.so.com/doc/24368318-25185095.html 我们要爬取的内容: html字段: r ...

  6. python使用requests库爬取淘宝指定商品信息

    python使用requests库爬取淘宝指定商品信息 在搜索栏中输入商品 通过F12开发者工具抓包我们知道了商品信息的API,同时发现了商品数据都以json字符串的形式存储在返回的html内 解析u ...

  7. Python爬虫新手入门教学(十三):爬取高质量超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  8. python怎么爬取b站_【Python爬虫实例学习篇】——4、超详细爬取bilibili视频

    [Python爬虫实例学习篇]--4.超详细爬取bilibili视频 由于经常在B站上学习,但无奈于家里网络太差,在线观看卡顿严重,于是萌生了下载视频的想法(如果只是单纯想下载视频,请用you-get ...

  9. Python爬虫新手入门教学(二):爬取小说

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

最新文章

  1. 个盘子的汉诺塔需要移动几步_图解汉诺塔问题( Java 递归实现)
  2. 企业 - php nginx memcache
  3. mysql left join 空值_MYSQL Left Join如何选择NULL值?
  4. python-用Map, Filter, Reduce代替For循环
  5. AntV中的饼状图中的花瓣图旁边的文字显示label怎样修改
  6. 「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld
  7. oracle数据泵导入分区表,数据泵导入分区表统计信息报错(七)
  8. Jzzhu and Sequences(CF-450B)
  9. 计算机彻底删除删除后如何恢复,如何完全恢复从计算机删除的文件?
  10. 设计模式03-工厂方法
  11. 5.文件操作 --- 系统调用
  12. Angular——Angular 教程
  13. sklearn交叉验证2-【老鱼学sklearn】
  14. php 12306模拟登录,12306 selenium 模拟登录
  15. 【网络设备】单臂路由和STP配置及理论
  16. win10计算机无法复制文件,Windows10系统无法复制文件到u盘的解决方案
  17. 并查集+思维——Destroying Array
  18. (转载)JS与WebView交互存在的一些问题
  19. 谷歌浏览器怎么管理收藏夹 收藏夹分类整理步骤
  20. Redis持久化中RDB和AOF有哪些区别?你知道吗!

热门文章

  1. UI设计师需要什么样的美术能力?
  2. 思维导图XMind中如何换行
  3. 基于LinuxCNC下的estun从站控制
  4. 亚马逊Listing调整得好叫优化,调整不好叫破坏!
  5. html网页自动铺满屏幕,html – 响应式DIV填满整个屏幕
  6. Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数
  7. BBC六分钟英语-母鸡能教给我们关于等级制度的什么东西
  8. docker1.12在cento7里的组建swarm (一)
  9. 买内存条需要知道的信息
  10. 用大数据讲商业地产新故事