更新:
2018.10.15 改变了排版,添加了新的文档链接,改写了一些措辞
一.准备工作
在于浏览器的帮助下,我们能够比较舒服的查看一个网页中的各种信息,但是要是没有网页的话,直接观察一个网页是十分吓人的.因为都是网页的源代码,就算是有经验的人也不会像在浏览器中直观舒服。
这一部分的内容就是在不通过浏览器的帮助下查看翻译数据信息和结构.这章通过在某个页面发一个GET请求给网络服务器,然后做一些简单的数据抽取.
首先是讲一下我们接下来常用的工具。
Ⅰ.urllib包
urllib官方文档:urllib — URL handling modules
这个包是一个标准Python包.我们不用额外的安装了,直接import直接用就行.这个包贯穿始终,所以很重要.记得时常翻看python的帮助文档.
- 注意:你可能在其他的教程中经常看到
urllib
和urllib2
,在python3中“合并”了,你只需要一个urllib
就行。至于怎么用后面会解释。
urllib包中具体又有4个模块:
urllib.request 打开和读取URLs
urllib.error 包含urllib.request抛出的一些异常.
urllib.parse for parsing URLs
urllib.robotparser for parsing robots.txt files
在本部分,你暂时只需要关注urllib.request 这个模块,这个模块定义了一些函数和类来帮助打开URL连接(通常是HTTP形式的).你可以认为算是python2中的urllib2模块。所以在python2中经常看见的import urllib2
可以认为是等价于python3中的import urllib.request
2.BeautifulSoup包
官方文档:Beautiful Soup Documentation
BeautifulSoup要把没有意义的东西变得有意义,他能够塑造和组织HTML的格式使其变得可读.这个库并不是标准的python库,所以要自行安装,下面一条命令就行了。
pip install beautifulsoup4
二:请求(request)操作
Ⅰ.基本
下面通过一个最基本的例子来体验一下怎么得到一个百度首页的源代码。
代码:
import urllib.request
import urllib.parse
import urllib.error
import urllib.response
response=urllib.request.urlopen(url="https://www.baidu.com/")
print("type of response:",response)
content=response.read()
print(content)
结果:
解释:
上面的程序就是得到了baidu.com的网页源代码,前面的4个import语句就是把urllib的全部模块都引进来了。这样写是为了以后扩展也方便展示熟悉urllib的模块数量。事实上,这里用到的模块只有urllib.request
这个模块。
我们这里得到了网页的源代码(虽然输出有一些杂乱无章),装逼的说,我们已经爬下来一个网页了。是不是很简单?
这里其关键作用的一句话就是urllib.request.urlopen(url="https://www.baidu.com/")
,这个函数的作用就是打开某个字符串表示的url或者是一个Request对象表示的url,并且返回某些相应的response对象。这里看的不是很懂没有关系,后面慢慢积累经验就懂了。
下面是这个函数的原型:
urllib.request.urlopen(url,data=None,[timeout,],cafile=None, capath=None, cadefault=False, context=None)*
这里只解释url的意思,其他的参数以后实战中用到再解释.
***url:***待打开的URL,可以是字符串也可以是一个Request对象。必须带上的参数
上面是一个非常简洁的写法,这里推荐另外一种更加“标准”的写法。
代码:
import urllib.request
import urllib.parse
import urllib.error
import urllib.response
req=urllib.request.Request(url="https://www.baidu.com/")
response=urllib.request.urlopen(req)
print("type of response:",response)
content=response.read()
print(content)
这里通过req=urllib.request.Request(url="https://www.baidu.com/")
来生成一个Request对象,然后把Request对象传进urlopen()函数中。
这么做的好处就是逻辑上面会更加的明确。
Ⅱ.运行BeautifulSoup
在这里并不会讲太多BeautifulSoup的使用,只是简单的用一下这个库。前面看到,你“爬”下来的网页输出的源代码是杂乱无章的,你很难清楚的看明白。
BeautifulSoup能够很好地处理HTML文件的任意结点信息(当然功能不仅仅如此),方便我们用的更加直观。废话少说,举个例子。
import urllib.request
import urllib.parse
import urllib.error
import urllib.response
from bs4 import BeautifulSoup
request=urllib.request.Request(url="http://tech.qq.com/a/20170223/000339.htm")
response=urllib.request.urlopen(request)
bs=BeautifulSoup(response.read())
print(bs.title)
这里唯一的变化就是引入了BeatifulSoup对象,把response对象中读出的信息传导这个对象构造函数中,就能方便的读取其中的某些结点了。
至此,最基本的一节就到这里了,这节并不打算说很多的东西,只是一个简单的介绍,对于python爬虫有一些感性的认识.