所谓网络爬虫,通俗的讲,就是通过向我们需要的URL发出http请求,获取该URL对应的http报文主体内容,之后提取该报文主体中我们所需要的信息。
下面是一个简单的爬虫程序
http基本知识
当我们通过浏览器访问指定的URL时,需要遵守http协议。本节将介绍一些关于http的基础知识。
http基本流程
我们打开一个网页的过程,就是一次http请求的过程。这个过程中,我们自己的主机充当着客户机的作用,而充当客户端的是浏览器。我们输入的URL对应着网络中某台服务器上面的资源,服务器接收到客户端发出的http请求之后,会给客户端一个响应,响应的内容就是请求的URL对应的内容,当客户端接收到服务器的响应时,我们就可以在浏览器上看见请求的信息了。
我们可以通过python的requests模块很方便的发起http请求。requests模块是第三方模块,安装完成之后直接import就能使用。下面介绍一些简单的用法
发起请求
import requests # 请求的首部信息 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36' } # 例子的url url = 'https://voice.hupu.com/nba' # 虎扑nba新闻 # 利用requests对象的get方法,对指定的url发起请求 # 该方法会返回一个Response对象 res = requests.get(url, headers=headers) # 通过Response对象的text方法获取网页的文本信息 print(res.text)
上面的代码中,我们向虎扑的服务器发送了一个get请求,获取虎扑首页的nba新闻。headers参数指的是http请求的首部信息,我们请求的url对应的资源是虎扑nba新闻的首页。获取到对应的网页资源之后,我们需要对其中的信息进行提取。
通过BeautifulSoup提取网页信息
BeautifulSoup库提供了很多解析html的方法,可以帮助我们很方便地提取我们需要的内容。我们这里说的BeautifulSoup指的是bs4。当我们成功抓取网页之后,就可以通过BeautifulSoup对象对网页内容进行解析。在BeautifulSoup中,我们最常用的方法就是find()方法和find_all()方法,借助于这两个方法,可以轻松地获取到我们需要的标签或者标签组。关于其他的方法,可以参考bs4的官方文档:BeautifulSoup
find()方法和find_all()方法的用法如下
find(name , attrs , recursive , string , **kwargs ) # find_all()方法将返回文档中符合条件的所有tag, find_all(name , attrs , recursive , string , **kwargs )
from bs4 import BeautifulSoup # BeautifulSoup对象接收html文档字符串 # lxml是html解析器 soup = Beautiful(res.text, 'lxml') # 下面的方法找出了所有class为hello的span标签 # 并将所有的结果都放入一个list返回 tags = soup.find_all('span', {'class': 'hello'})
实例扩展:
实例一:
#第一种方法 import urllib2 #将urllib2库引用进来 response=urllib2.urlopen("http://www.baidu.com") #调用库中的方法,将请求回应封装到response对象中 html=response.read() #调用response对象的read()方法,将回应字符串赋给hhtml变量 print html #打印出来
实例二:
#第二中方法 import urllib2 req=urllib2.Request("http://ww.baidu.com") response=urllib2.urlopen(req) html = response.read() print html