利用img请求一个html页面,爬虫学习笔记——爬取单个网页里的所有图片(入门)...
最近闲着,想学一下爬虫 (^-^)V ——[手动比耶]先从简单的练习开始吧~ 爬取单个网页里的所有图片,这个没有什么难点,因为不需要翻页哈哈哈哈。
我很喜欢一些文章中的配图,比如这篇,里面就会有很多电影中的经典截图。
第一步:分析网页
首先需要了解要爬取网站的页面,查看网页源代码。然后根据网页源代码的结构,想好代码的步骤和思路。
在网页中查看页面的源代码(F12)
先来看一下页面的请求方式:
在开发者模式的Network里找到.html的请求,可以看到请求方式是GET请求,也没有带什么特殊的请求参数之类的~ 比较简单。
(如果没有看到.html的请求,刷新一下页面就出来了)
然后再看代码结构:
(不太熟悉html的小伙伴可以使用圈圈里的小箭头,点一下自己想要看的元素,然后右侧就会自动跳转到该元素对应的代码区域的~四不四很简单)
结合“上下文”简单分析一下就会发现:(有种做阅读理解的感觉hhhhh)
① 这个网页里所有的图片都是放在 标签里的 src 后面,src后面这个链接就是图片的地址
(可以复制下来在浏览器打开确认一下)
② 图片上方的描述语是放在class="pictext"的 p 标签里的
(曾打算过用这个描述语句作为爬下来的图片的名称的)
这样一来就很简单了
只需要先拿到网页的 HTML 代码,然后把页面里面所有 标签里的 src 后面超链接的内容取出来就行了!
第二步:开始编程
1. 定义库
首先需要用 requests 库来发出一个网络请求:
import requests
然后需要用 BeautifulSoup 来解析和提取 HTML 数据
from bs4 import BeautifulSoup
这里也可以直接import bs4,但代码中每次用的时候都要写上包名bs4,如:bs4.BeautifulSoup 啥啥啥
而from bs4 import BeautifulSoup 是直接将BeautifulSoup 类导入到当前命名空间直接使用,不需要再带包名。因此建议用from bs4 import BeautifulSoup
最后需要还需要用 urllib.request 来将网络对象复制到本地文件
import urllib.request
感觉urllib.request 和前面导入的 requests有点像呀~ 查了一下资料发现是这样:
通常而言,在我们使用python爬虫时,更建议用requests库,因为requests比urllib更为便捷,requests可以直接构造get,post请求并发起,而urllib.request只能先构造get,post请求,再发起。
但是将网络对象复制到本地文件这个功能需要通过urllib.request.urlretrieve()函数来实现,所以两个库都导入了。
这个网页比较简单,导入这三个库就够用了~
2. 定义一个函数getMoviesImg()
① 获取网站数据:res = requests.get(url,params=params,headers=headers) 这样获取到的结果是一个 HTTP 状态码。
需要用.text 方法再来获取一下这个结果里的文本信息。
有的网站对于反爬虫力度比较大,请求的时候可以构造一个请求头加上,请求头(Request Headers)在最前面开发者模式中的 Network 里就可以找到。
今天爬取的这个页面很简单,就直接 GET 请求 url 即可,可以啥都不带。
#获取网站数据
url = requests.get('http://news.jstv.com/a/20171018/1508322421993.shtml')
#url.encoding = 'utf-8' #如果需要用到页面中的汉字内容,则需要进行解码,否则中文会出现乱码
html = url.text
ps:比如这个页面↓,百度搜索“经典电影台词截图”,请求的url就是由问号 ? 前面基本的url地址和后面的一大堆参数组成的,这时候就需要用到 params 了。
② 解析网页:
BeautifulSoup4 是将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,之后就可以利用 soup 加标签名轻松地获取这些标签的内容了。
参考beautifulsoup菜鸟教程
BeautifulSoup(markup,'html.parser')
markup 是被解析的html格式的内容
html.parser表示解析用的解析器
#解析网页
soup = BeautifulSoup(html,'html.parser')
③ 获取所有标签内容:
完成了前面的工作,获取标签内容就变得很简单了~
#获取所有的img标签
movie = soup.find_all('img')
#获取src路径
for i in movie:
imgsrc = i.get('src')
扩展一下~
bs = BeautifulSoup(html,"html.parser")
print(bs.title) # 获取title标签的所有内容
print(bs.title.name)# 获取title标签的标签名称
print(bs.title.string)# 获取title标签的文本内容
print(bs.head) # 获取head标签的所有内容
print(bs.div) # 获取第一个div标签中的所有内容
print(bs.div["id"]) # 获取第一个div标签的id的值
print(bs.a) # 获取第一个a标签的所有内容
print(bs.find_all("a")) # 获取所有的a标签的所有内容
print(bs.find(id="u1")) # 获取id="u1"
for item in bs.find_all("a"):
print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值
for item in bs.find_all("a"):
print(item.get_text())# 获取所有的a标签,并遍历打印a标签的文本值
④ 将URL表示的网络对象下载到本地:
我这里用到的是 urlretrieve () 函数,它可以直接将远程数据下载到本地。urlretrieve(url, filename=None, reporthook=None, data=None)
url:外部或者本地url,url中建议不要含有中文,否则容易出错。
finename:指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
data:指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。
#将URL表示的网络对象复制到本地文件
urllib.request.urlretrieve(imgsrc , filename )
第三步:执行
run run run!
(最后有个无伤大雅的小报错,就不截图啦)
等它都跑完就可以在指定目录中看到网页里所有的图片啦~
——————————————— 补充 ———————————————
第四步:优化一下吧
执行以后发现会存在两个问题:
网页中还有很多其它的图片,也是放在img标签里的,需要把这些图片过滤掉;
有一些src是空的,.urlretrieve()函数就会报错:ValueError: unknown url type: ''。
想了一个比较简单的解决办法,就是只下载符合要求的src链接。
打印出所有的 src 路径,就会发现网页中所有想要的图片的链接路径都是以 “http://static.jstv.com/gather/hl/20171018/” 开头的。
这样的话就可以用.startswith()函数判断之后再下载。
#判断图片src路径是否以指定内容开头(过滤页面中的其它不想要的图片)
if imgsrc.startswith('http://static.jstv.com/gather/hl/20171018/'):
……
改改改,runrunrun
多好看~~~
最后附上并没有多少行的完整代码:
import requests
import urllib.request
from bs4 import BeautifulSoup
def getMoviesImg():
url = requests.get('http://news.jstv.com/a/20171018/1508322421993.shtml')
#获取网站数据
html = url.text
#解析网页
soup = BeautifulSoup(html,'html.parser')
#获取所有的img标签
movie = soup.find_all('img')
x = 1
for i in movie:
# 获取src路径
imgsrc = i.get('src')
#判断图片src路径是否以指定内容开头(过滤页面中的其它不想要的图片)
if imgsrc.startswith('http://static.jstv.com/gather/hl/20171018/'):
# print(imgsrc)
#本地路径
filename = 'E:/download/movie/%s.jpg'%x
#将URL表示的网络对象复制到本地文件
urllib.request.urlretrieve(imgsrc , filename)
print('下载第%d张' % x)
x += 1
print('**下载完成!**')
getMoviesImg()
立两个小小的flag在这里:
下次想用网页里图片的描述作为对应图片下载后的名称。
以后再爬个好看的小说吧!
撒花!!!✿✿ヽ(°▽°)ノ✿
作者:HeidiYa
利用img请求一个html页面,爬虫学习笔记——爬取单个网页里的所有图片(入门)...相关推荐
- Python爬虫练习笔记——爬取单个网页里的所有图片(入门)
最近闲着,想学一下爬虫 (^-^)V --[手动比耶] 先从简单的练习开始吧~ 爬取单个网页里的所有图片,这个没有什么难点,因为不需要翻页哈哈哈哈. 我很喜欢一些文章中的配图,比如这篇,里面就会有很多 ...
- 爬虫学习笔记--爬取静态网页
声明:我这里是学习 唐松老师的<Python网络爬虫从入门到实践>的学习笔记 只是记录我自己学习的过程 详细内容请购买老师正版图书 import requestsr = requests ...
- Python爬虫学习笔记 -- 爬取糗事百科
Python爬虫学习笔记 -- 爬取糗事百科 代码存放地址: https://github.com/xyls2011/python/tree/master/qiushibaike 爬取网址:https ...
- Python数据爬虫学习笔记:爬取豆瓣阅读的出版社名称数据
环境准备: 1.python 3.0+ 2.豆瓣出版社网址 https://read.douban.com/provider/all 1.打开浏览器,输入网址,右击网页,查看网页源码 2.看上图我们发 ...
- Python爬虫练习笔记——爬取一本小说并保存为txt文件
最近竟然开始磕起了黄晓明和尹正的CP!!! 但是万恶的爱某艺不好好更新剧集,居然搞起了超前点映- WTF???有什么是我这个贫穷而又尊贵的VIP用户不能看的吗??? 于是我决定开始看小说了!找个网站把 ...
- 笨方法学 python3 豆瓣_python3 爬虫学习:爬取豆瓣读书Top250(一)
本节课,我们试着来写一个基础的爬虫,来爬取一下豆瓣读书top250的内容:主要涉及的知识就是我们之前讲过的requests库. 网页分析 我们先选取一个待会准备爬取的网站,咱们选个较好爬的网页,豆瓣读 ...
- Python爬虫学习之爬取淘宝搜索图片
Python爬虫学习之爬取淘宝搜索图片 准备工作 因为淘宝的反爬机制导致Scrapy不能使用,所以我这里是使用selenium来获取网页信息,并且通过lxml框架来提取信息. selenium.lxm ...
- 写一个简单的爬虫来批量爬取新浪网的新闻
如标题,学习爬虫也有一段时间了,今天来爬取一下新浪网的新闻(其实之前自己爬过,但是隔了好久发现新浪网的网页结构有一些变化导致之前的爬虫失效了,这两天进行了一下代码更新),话不多说,进入正题. 工具:A ...
- 为了部落 来自艾泽拉斯勇士的python爬虫学习心得 爬取大众点评上的各种美食数据并进行数据分析
为了希尔瓦娜斯 第一个爬虫程序 csgo枪械数据 先上代码 基本思想 问题1 问题2 爬取大众点评 URL分析 第一个难题 生成csv文件以及pandas库 matplotlib.pyplot库 K- ...
最新文章
- Android Gradle 笔记
- python编程语言好学吗-转行零基础该如何学习python?很庆幸,三年前的我选对了...
- hdu 1150 Machine Schedule (经典二分匹配)
- EMMC与NAND FLASH核心对比
- php输出多余的空格或者空行
- LuoguP1131 [ZJOI2007]时态同步
- SciPy 积分的计算
- 如何有效提高你的沟通技巧
- word转chm_如何免费在线将图像转换为Word?
- MFC避免窗口闪烁的方法(OnEraseBkgnd) .
- 一步一步学linq to sql(七)并发与事物
- win pxe安装linux,windows系统架设PXE+TFTP+HTTP安装CentOS 4.7 体验
- java基础练习题及答案_java基础测试题含答案.docx
- PS AD命令之Remove-adcomputer!
- peer channel create解析
- vc2010下调用miniblink控件实现浏览器简单实例
- 计算机科学与技术专业教学计划表
- C# 构造器-实例构造器,类型构造器
- linux内核机制之设备树
- 使用 Pycharm 创建一个 Django项目(详解)