一、了解网页
打开任何一个网页,这里以百度首页为例,如图
按快捷键【Ctrl+U】打开源码界面,如下图所示
网页一般由三部分组成,分别是HTML(超文本标记语言)、CSS(层叠样式表)、JScript(活动脚本语言),其中HTML是整个网页的结构,CSS表示样式,JScript表示功能。(这里只简要介绍一下,相关知识的具体介绍请见其它资料)
二、使用requests库请求网站
(1)网页请求的过程
Request(请求)
每一个展示在用户前面的网页都必须经过这一步,也就是向服务器发送访问请求。
Response(响应)
服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接受服务器响应的内容,将内容展示出来,就是我们熟悉的网页请求。
(2)网页请求的方式
GET:最常见的方式,一般用于获取或者查询资源信息,是大多数网站使用的方式,响应速度快。
POST:相比GET方式,多了以表单形式上传参数的功能,可以修改信息
(3)使用GET方式抓取数据
首先我们找到我们想要爬取对象,这里我的实例请求对象是中国旅游网 ——中国文旅门户网站 (cntour.cn),请求方式是GET(所有在源码中的数据请求都是GET)
确定好请求对象和方式后,在自己的编译器上输入以下代码(可以是pycharm,我这里的运行环境是VScode)
import requests #导入requests包
url='http://www.cntour.cn/'
p=requests.get(url) #get方式,获取网页数据
print(p.text)
如下图所示(VScode),按F5再按enter
得到输出结果如下
案例说明
1、加载库使用的语句是import+库的名字,上述过程中,加载requests库的语句是:import requests.
2、用GET方式获取数据需要调用request库中的get方法,如下所示
requests.get
3、将获取的数据存到变量中,这里我选择的是p,如下所示
p=requests.get(url)
4、这里p就是一个URL对象,他代表整个网页,下面的语句代表网页中的源码
p.text
(4)使用post方式抓取爬虫
我们以有道翻译的网址来进行实例讲解,首先进入有道翻译的网址在线翻译_有道 (youdao.com),然后按F12进入开发者模式,单机网络,此时内容为空,如下所示。
在有道中翻译中输入“这瓜保熟吗 ”进行翻译,如下图所示
同样进入开发者模式中,按F12,点击网络和XHR按钮,找到翻译数据。
再单机标头,发现请求数据的方式为post,如图
由此我们确定数据所处之处和请求方式之后,开始撰写爬虫代码;
首先,我们将标头header中的url(就是统一资源定位,一个表示,就是网络地址)复制出来,并赋值给url,如下所示。
代码如下:
url='https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
其中,post的请求方式和get不同,它必须构建请求头才可以。Form Data中的请求参数如下所示,将其复制并构建一个新字典。
代码如下:
Form_data= {'i': '这瓜保熟吗','from' : ' AUTO ' , 'to':' AUTO','smartresult': 'dict','client': 'fanyideskweb',
'salt':' 16299609133248',
'sign':' b78270339ca72725d073e6b75887ee9a',
'lts': '1629960913324',
'bv': 'fc41b27ce835a3ef91482b3bc56520d8',
'doctype':' json',
'version': '2.1',
'keyfrom':' fanyi.web',
'action': 'FY_BY_REALTlME'}
接下来使用request.post方法请求表单数据,代码如下:
import requests
response=requests.post(url,data=payload)
将字符串格式的数据转换为JSON格式数据,根据数据结构,提取数据,并将翻译结果打印出来,代码如下:
import json
content = json.loads(response.text)
print(content['translateResult'][0][0]['tgt'])
使用requests.post抓取有道翻译结果的完整代码如下:
import requests
import json
def get_translate_date(word=None):
url='https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
Form_data= {'i': '这瓜保熟吗','from' : ' AUTO ' , 'to':' AUTO','smartresult': 'dict','client': 'fanyideskweb',
'salt':' 16299609133248',
'sign':' b78270339ca72725d073e6b75887ee9a',
'lts': '1629960913324',
'bv': 'fc41b27ce835a3ef91482b3bc56520d8',
'doctype':' json',
'version': '2.1',
'keyfrom':' fanyi.web',
'action': 'FY_BY_REALTlME'}
#请求表单数据
response=requests.post(url,data=payload)
#将json格式字符串转字典
content = json.loads(response.text)
#打印翻译过后的数据
print(content['translateResult'][0][0]['tgt'])
if_name__=='_main_':
get_translate-date('我爱数据')
三、使用Beautiful Soup解析网页
通过requests库可以抓到网页源码,接下来就是从源码中找到并提取数据。Beautiful Soup是python中的一个库,其最主要的功能就是从网页中抓取数据。Beautiful Soup已经被移植到bs4中,我们需要提前安装好bs4库。
Beautiful Soup库能够轻松解析网页信息,它被移植到bs4中,需要时可以从bs4中调用,表达语句如下。
from bs4 import BeautifulSoup