说点什么
其实一直以来,对于python
这个语言还是很感兴趣的,但是以前一直在做图像处理相关的东西,所以对这种无法触及底层内存处理的语言一直没怎么关注过,不过最近实在是被C++的字符串处理和复杂芜杂的网络框架给整崩溃了,而且看到大家都说python
很好玩,就趁着最近没事来学一下python
。
昨天跟着廖雪峰老师的python
教程(比较推荐它的基础教程),看了看基本的数据结构和逻辑之后,决定还是直接从实际的一个小项目来练手(对我来说这是我熟悉一门新语言的最好的方式),所以直接就选择比较简单的python
爬虫项目来练手了。
写爬虫最重要的就是要了解我们平时访问的网页是什么东西,其实我们平时访问的网页其源码就是一个字符串文件(当然也可以说二进制文件)
每次当我们在浏览器上输入一个网址的时候,比如 www.google.com
这个网址,浏览器就会根据其绑定的ip地址,帮助我们访问远端服务器并发送请求,远端服务器就会将这个网页的源码直接打包发给我们的浏览器(html
文件格式),然后由我们的浏览器将这一字符串文件进行解析,比如通过div、h1、h2
这些布局对网页进行格式化的渲染和展示,对img
这些资源继续向远端服务器发送请求获取图片等,然后填装到网页上。
爬虫是什么
怎么说呢,爬虫,往简单的地方来说,就是模拟浏览器去获取一个网页的源码,至于你拿这个源码干嘛,那就不重要了。
复杂的说,爬虫其实是一切网页数据处理的综合,比如:自动爬取网页源码、分析网页数据、获取关键数据并进行保存,或者自动下载需要的网页图片、音频、视频的工具。
所以当我们在写一个pythonm爬虫的时候,我们在写什么?
当我们需要一个爬虫的时候,一般是我们遇到了比较复杂的数据需求,这个需求对于手工来说很复杂,单这个需求正是爬虫可以很简单地解决的。
所以首先确定我们的需求,我们需要这个爬虫去做什么?
比如我们觉得一个教学网站的数据很有意思,但是其格式太过于复杂,或者需要频繁的翻页不能凭复制粘贴很简单地拿到的时候,爬虫就有了作用。
总之,还是拿一个爬虫实例来进行说明吧。
爬取百度图片
ps:python 版本 —— Python 3.7.0
第一个爬虫,当然不能选取太复杂的需要涉及到很多复杂的网络规则的东西,所以我们就爬一些很简单地允许爬虫爬的网站吧。
比如爬取并下载某个关键词下的百度图片的图片数据。
1、确立需求
- 可以修改关键词爬取我们想要的不同的图片集
- 可以选择爬取的图片数量
- 爬取的图片大小是原图片大小
- 爬取鲁棒性
暂时就确定上面的几个需求吧,然后开始真正的爬虫代码的编写
2、观察网页源码
首先打开百度图片,随意搜索一个关键词,比如这次用我比较喜欢的动漫角色 栗山未来 来进行测试
右键查看网页源代码之后可以看到,每张图片的原地址开头都是很简单的"objURL"
,结尾都是一个小逗号,如下:
根据这点我们可以确定这个爬虫该如何进行操作了,很简单——从网页源码中提取出这些url并进行下载就可以了 \(^o^)/~
3、获取网页源码
其实这一步我有点不想写的,不过担心有看我的博客刚学python
的朋友可能会出现错误,还是说一下吧。
首先,我们需要引入python
中的网络库urllib
,由于我们要用到的urlopen
和read
方法在我这个版本的python
中,直接引用urllib
会出现错误,所以一般采用此import
:import urllib.request
整个的提取网页源码的方法如下:
import urllib.request
def get_html(httpUrl):
page = urllib.request.urlopen( httpUrl )#打开网页
htmlCode = page.read( )#读取网页
return htmlCode
我们可以把这个方法打包成一个py文件,以后直接就可以在其他py文件中import
一下这个方法,然后直接使用我们写好的get_html
方法就可以了。
然后将上方获取到的二进制文件,解码成一个正常地字符串:
html_code=get_html(search_url)
html_str=html_code.decode(encoding = "utf-8")#将二进制码解码为utf-8编码,即str
4、提取图片地址
说到提取网页源码中的关键数据,其实就是字符串匹配,这要是在C++
里面估计得把我累死,当然我也的确写过类似的,甚至更复杂的,实在是惨痛的回忆。
这里向大家推荐一下比较简单的字符串检索和匹配方案——正则表达式,又称规则表达