Python爬虫学习 - day1 - 爬取图片
利用Python完成简单的图片爬取
最近学习到了爬虫,瞬时觉得很高大上,想取什么就取什么,感觉要上天。这里分享一个简单的爬取汽车之家文章列表的图片教程,供大家学习。
需要的知识点储备
本次爬虫脚本依赖两个模块:requests模块,BeautifulSoup模块。其中requests模块完成url的请求,而BeautifulSoup模块负责解析Html标签。
requests模块
requests.get(url) 向URL发起GET请求
requests.post(url) 向URL发起POST请求
- >>> import requests
- >>> response = requests.get('https://www.baidu.com')
- >>> print(response.text)
- <!DOCTYPE html>
- <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=styleshee
- ......
- ......
- </body> </html>
- # 上面为页面信息
- >>>
可以看到response是服务端返回的信息:在requests内部也被封装成了一个对象,它具有很多属性,主要如下:
- response.text:以字符串的形式显示返回的信息
- response.content:以字节的形式显示返回的信息(bytes对象)
- response.encode:告诉requests 已什么编码格式进行解析
- response.url:请求的url(当使用get方式发送数据时,可以显示具体的url)
- response.encoding:查看requests自动识别的网页编码
- response.json():对于返回值是json格式的,那么可以直接使用json(),提取成字典
- response.headers:获取响应头信息(响应头是一个字典,支持字典操作)
- response.cookies:获取服务端响应的cookies
数据提交
访问站点时进行数据提交根据请求的方式不同,主要分两种,即GET提交,POST提交。
当使用GET方式提交时,数据是拼接到URL进行提交的,那么这个时候需要使用params参数来定制提交的数据(提交的数据为字典类型)
- import requests
- data = {'wd': '词典'}
- response = requests.get('http://www.baidu.com/s', params=data)
- print(response.url) # http://www.baidu.com/s?wd=%E8%AF%8D%E5%85%B8 --> 中文会被编码
- print(response.text) # 返回的内容
当使用POST方式提交时,数据是放在请求体中提交的,那么这个时候就需要使用data参数了(提交的数据为字典类型)
- import requests
- data = {'wd': '词典'}
- response = requests.post('http://www.baidu.com/s', data=data) # 注意
PS:requests的data参数使用application/x-www-form-urlencoded
对POST数据编码。如果要传递JSON数据,可以使用json参数来让requests对数据使用json编码。
文件上传
上传文件需要更复杂的编码格式,但是requests把它简化成files
参数:
- >>> upload_files = {'file': open('report.xls', 'rb')}
- >>> r = requests.post(url, files=upload_files)
在读取文件时,注意务必使用'rb'
即二进制模式读取,这样获取的bytes
长度才是文件的长度。
把post()
方法替换为put()
,delete()
等,就可以以PUT或DELETE方式请求资源。
BeautifulSoup模块
soup = BeautifulSoup(html页面,features='html.parser') 把返回的页面交给BeautifulSoup进行处理,生成soup对象,其中features表示使用的解析方式,这里使用html.parser,因为内置,其他的也可以使用lxml,速度要快于html.parser但是需要额外安装。
soup 是BeautifulSoup对象,它具有查找修改获取等等众多功能。
- soup.find() 用于对HTML标签进行查找,找到一个就返回
- soup.find_all() 用户对HTML标签进行遍历,查到所有的标签后,以列表的形式返回
- soup.get() 获取标签的单个属性的值
- soup.attrs 获取标签的所有属性,返回字典
- soup.text 获取标签的内容
利用Python完成汽车直接文章列表的图片爬取
想要爬取什么信息,那么首先需要我们查看一下相关网页的源码信息,确定要爬取的标签以及属性。
确认爬取信息
打开http://www.autohome.com.cn/all/ 文章评测页面。打开调试模式,查看网页源码
- <div id="auto-channel-lazyload-article" class="article-wrapper">
- <ul class="article">
- <li data-artidanchor="908300">
- <a href="//www.autohome.com.cn/news/201710/908300.html#pvareaid=102624">
- <div class="article-pic"><img
- src="//www2.autoimg.cn/newsdfs/g21/M06/8A/59/120x90_0_autohomecar__wKgFVVnpmymAYrwNAAFqGWS9P0k275.jpg">
- </div>
- <h3>全新外观设计 全新Vanquish谍照曝光</h3>
- <div class="article-bar">
- <span class="fn-left">56分钟前</span>
- <span class="fn-right">
- <em><i class="icon12 icon12-eye"></i>4130</em>
- <em data-class="icon12 icon12-infor" data-articleid="908300"><i
- class="icon12 icon12-infor"></i>19</em>
- </span>
- </div>
- <p>[汽车之家 海外谍照] 日前,有海外媒体曝光了一组阿斯顿·马丁全新一代Vanquish车型路试谍照,新车在外观部分进行了全面的革新,此外,...</p>
- </a>
- </li>
- <li data-artidanchor="908294">
- <a href="//www.autohome.com.cn/culture/201710/908294.html#pvareaid=102624">
- <div class="article-pic"><img
- src="//www3.autoimg.cn/newsdfs/g15/M10/B6/51/120x90_0_autohomecar__wKjByFnpd-uAVVwWAAFlp02ujCY900.jpg">
- </div>
- <h3>买游戏送汽车 《GT赛车》发布最强同捆</h3>
- <div class="article-bar">
- <span class="fn-left">3小时前</span>
- <span class="fn-right">
- <em><i class="icon12 icon12-eye"></i>8318</em>
- <em data-class="icon12 icon12-infor" data-articleid="908294"><i
- class="icon12 icon12-infor"></i>49</em>
- </span>
- </div>
- <p>[汽车之家 车坛勐料] 先来做个名字解释,“同捆”是指游戏主机外加一款或多款游戏的套装,很多时候“同捆包”中还会包含一些该游戏的周边产品,比如模型。...</p>
- </a>
- </li>
- ...
- ...
- ...
- </ul>
- </div>
观察源码发现,得出的结论:
- 要获取的信息都被一个div标签包裹,并且该标签具有id属性,由于id属性页面唯一,可以通过该属性确定查找范围
- li标签是一条一条的文章信息
- 每个文章信息中的img标签的src属性即为图片的地址
完整的代码
- import requests
- from bs4 import BeautifulSoup
- response = requests.get(url='http://www.autohome.com.cn/all/')
- response.encoding = 'gbk'
- soup = BeautifulSoup(response.text,features='html.parser')
- tag = soup.find(id='auto-channel-lazyload-article')
- title = tag.find_all('li')
- for tag in title:
- if tag.find('h3'):
- print(tag.find('h3').text)
- if tag.find('a'):
- print('http:'+tag.find('a').get('href'))
- if tag.find('img'):
- img_url = tag.find('img').get('src')
- imgname = img_url.split('/')[-1]
- img_obj = requests.get('http:'+img_url)
- with open('imgs/%s' % imgname,mode='wb') as f:
- f.write(img_obj.content)
注意:
- 由于汽车之家页面使用gbk编码,所以这里指定编码格式为gbk,否则会出现乱码。
- 获取图片的url然后下载,把图片保存在本地
Python爬虫学习 - day1 - 爬取图片的更多相关文章
- python爬虫学习(7) —— 爬取你的AC代码
上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...
- Python爬虫学习之爬美女图片
最近看机器学习挺火的,然后,想要借助业余时间,来学习Python,希望能为来年找一份比较好的工作. 首先,学习得要有动力,动力,从哪里来呢?肯定是从日常需求之中来.我学Python看网上介绍.能通过P ...
- Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel
作为一名Pythoner,相信大家对Python的就业前景或多或少会有一些关注.索性我们就写一个爬虫去获取一些我们需要的信息,今天我们要爬取的是前程无忧!说干就干!进入到前程无忧的官网,输入关键字&q ...
- python爬虫学习(2) —— 爬一下ZOL壁纸
我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了. 那怎么办呢,我们尝试使用简单的爬虫来解决这个问题. 0. 本爬虫目标 抓取给定分类「或子分类」网址的内容 分析并得到每个分类下的所有 ...
- python爬虫学习之爬取全国各省市县级城市邮政编码
实例需求:运用python语言在http://www.ip138.com/post/网站爬取全国各个省市县级城市的邮政编码,并且保存在excel文件中 实例环境:python3.7 requests库 ...
- python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件
# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...
- python爬虫学习05-爬取图片
python爬虫学习05-爬取图片 确定要爬取的网址:https://shenan.tuchong.com/20903415/#image309854686 要爬取的内容:使用浏览器插件xpath对图 ...
- python爬虫学习01--电子书爬取
python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...
- [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈
我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点: 1.可以了解Python简单爬取图片的一些思路和方法 ...
随机推荐
- Ubuntu 首次给root用户设置密码
用过ubuntu的人都知道,刚安装好root用户是没有密码的,没有密码我们就没法用root用户登录.给root用户设置密码输入命令sudo passwd root,然后系统会让你输入密码,这时输入的密 ...
- 【转】ASP.NET Core 快速入门(环境篇)
原文链接:http://www.cnblogs.com/zhaopei/p/netcore.html [申明]:本人.NET Core小白.Linux小白.MySql小白.nginx小白.而今天要说是 ...
- (原) MatEditor部- UmateriaEditor中Texture使用过程(1)
@author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 最后YY需求(手滑)(开黑前弄下,充数,见谅) 1.在理清楚基础套路和细节后,自定义纹理资源,并加 ...
- 如何在指定文件夹下进入jupyter notebook
第一步: 打开 Anaconda Prompt 第二步: 查看文件夹所在路径 例如:你有个jupyterwork文件夹在 D:\ 路径下 第三步: 在Anaconda Prompt依次输入一下命令: ...
- 多版本python import 问题解决方案
原文http://www.tuicool.com/articles/EnE7nm6 多版本Python共存[支持使用pip安装包] 有时特殊需要会要用到高版本的Python, 但是系统自带的版本又是很 ...
- TensorFlow 常见错误与解决方法——长期不定时更新
1. TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a builtin_function_or_method ...
- Jquery append()总结(一) 转载
转载自:http://dushanggaolou.iteye.com/blog/1173457 append(content) /** * 向每个匹配的元素内部追加内容. * 这个操作与对指定的元素 ...
- Week1 Team Homework #1 from Z.XML-项目选择思路--基于对曾经大作业项目的思考
这两天试玩了一下去年学长的满分工程<shield star>游戏,再结合了一下他们团队的博客记录,有一种非常牛逼的感觉.具体对于这款游戏的一些思考和看法,毛大神已经说的很好了.因此,这里主 ...
- Maven中mirrors和repository的关系
一.前言 之前没有搞清楚pom.xml里面配置的repositorys节点配置的仓库和mirrors里面配置的仓库的“镜像”间的关系,特意去搜索了相关内容,这边有篇文章讲得透彻,所以这边转载一下~ 二 ...
- [Java] 为什么要定义接口
摘自:https://www.douban.com/note/61810488/ 通俗的讲,就是为了降低耦合度. 一个很搞笑的例子: 看看下面的程序: 一个学校里边,有两种人:学生.老师.他们都要吃饭 ...