python解析html页面获取数据 python html解析css_python post请求

[TOC]

Python爬虫基础

简介

Python爬虫爬取的网页信息中,HTML是网站主体架构,CSS是网页的外观细节,JavaScript为页面处理动作,通过对HTML文本的分析来提取信息。


了解网页

以Python中文网首页(https://www.py.cn/)为例,抓取中国旅游网首页首条信息(标题和链接),数据以明文的形式出面在源码中。在Python中文网首页,按快捷键【Ctrl+U】打开源码页面,如图所示:

python解析html页面获取数据 python html解析css_python post请求_02

认识网页结构

网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JScript(活动脚本语言)。

HTML

HTML 是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的。

常见的标签如下:

  

python解析html页面获取数据 python html解析css_python post请求_03

CSS

CSS 表示样式,图 1 中第 13 行<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。

JScript

JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。

如果用人体来比喻,HTML 是人的骨架,并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏乐器等。

Python爬虫的基本原理

简介

网页请求的过程分为两个环节:Request (请求)和Response(响应),Python爬虫就是模拟这个行为,通过请求获取网页信息。


网页请求的过程分为两个环节:

Request (请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。

Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,就是我们所熟悉的网页请求,如图所示。

python解析html页面获取数据 python html解析css_python post请求_04

网页请求的方式也分为两种:

GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。

POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。

所以,在写爬虫前要先确定向谁发送请求,用什么方式发送。

Get请求和Post请求

简介

GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。


使用 GET 方式抓取数据

请求对象是www.cntour.cn,请求方式是GET(所有在源码中的数据请求方式都是GET)[1]

确定好请求对象和方式后,在 PyCharm 中输入以下代码:

import requests        #导入requests包url = 'http://www.cntour.cn/'strhtml = requests.get(url)        #Get方式获取网页数据print(strhtml.text)

加载库使用的语句是 import+库的名字。在上述过程中,加载 requests 库的语句是:import requests。

用 GET 方式获取数据需要调用 requests 库中的 get 方法,使用方法是在 requests 后输入英文点号,如下所示:

requests.get

将获取到的数据存到 strhtml 变量中,代码如下:

strhtml = request.get(url)

这个时候 strhtml 是一个 URL 对象,它代表整个网页,但此时只需要网页中的源码,下面的语句表示网页源码:

strhtml.text

使用 POST 方式抓取数据

准备

首先输入有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。

按快捷键 F12,进入开发者模式,单击 Network,此时内容为空

python解析html页面获取数据 python html解析css_python post请求_05

在有道翻译中输入“我爱中国”,单击“翻译”按钮

python解析html页面获取数据 python html解析css_python post请求_06

在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据

python解析html页面获取数据 python html解析css_python post请求_07

单击 Headers,发现请求数据的方式为 POST。

找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。

爬取

首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下:

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。

Form Data 中的请求参数如图 15 所示:

python解析html页面获取数据 python html解析css_python post请求_08

将其复制并构建一个新字典:

From_data={'i':'我愛中國','from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt':'15477056211258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'1547705621125','bv':'b33a2f3f9d09bde064c9275bcb33d94e','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'}

接下来使用 requests.post 方法请求表单数据,代码如下:

import requests        #导入requests包response = requests.post(url,data=payload)

将字符串格式的数据转换成 JSON 格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下:

import jsoncontent = json.loads(response.text)print(content['translateResult'][0][0]['tgt'])

使用 requests.post 方法抓取有道翻译结果的完整代码如下:

import requests        #导入requests包import jsondef get_translate_date(word=None):    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'    From_data={'i':word,'from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt':'15477056211258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'1547705621125','bv':'b33a2f3f9d09bde064c9275bcb33d94e','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'}    #请求表单数据    response = requests.post(url,data=From_data)    #将Json格式字符串转字典    content = json.loads(response.text)    print(content)    #打印翻译后的数据    #print(content['translateResult'][0][0]['tgt'])if __name__=='__main__':    get_translate_date('我爱中国')

使用Beautiful Soup解析网页

简介

Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。


通过 requests 库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。

python解析html页面获取数据 python html解析css_python post请求_09

安装好 bs4 库以后,还需安装 lxml 库。如果我们不安装 lxml 库,就会使用 Python 默认的解析器。尽管 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此笔者推荐安装 lxml 库。

安装 Python 第三方库后,输入下面的代码,即可开启 Beautiful Soup 之旅:

import requests        #导入requests包from bs4 import    BeautifulSoupurl='http://www.cntour.cn/'strhtml=requests.get(url)soup=BeautifulSoup(strhtml.text,'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')print(data)

python解析html页面获取数据 python html解析css_python post请求_10

Beautiful Soup 库能够轻松解析网页信息,它被集成在 bs4 库中,需要时可以从 bs4 库中调用。其表达语句如下:

from bs4 import BeautifulSoup

首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中,代码如下:

soup=BeautifulSoup(strhtml.text,'lxml')

接下来用 select(选择器)定位数据,定位数据时需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令

python解析html页面获取数据 python html解析css_python post请求_11

随后在浏览器右侧会弹出开发者界面,右侧高亮的代码(参见图 19(b))对应着左侧高亮的数据文本(参见图 19(a))。右击右侧高亮数据,在弹出的快捷菜单中选择“Copy”➔“Copy Selector”命令,便可以自动复制路径。

python解析html页面获取数据 python html解析css_python post请求_12

将路径粘贴在文档中,代码如下:

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a

由于这条路径是选中的第一条的路径,而我们需要获取所有的头条新闻,因此将 li:nth-child(1)中冒号(包含冒号)后面的部分删掉,代码如下:

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a

使用 soup.select 引用这个路径,代码如下:

data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')

data就是提取的内容了。


References

[1] www.cntour.cn,请求方式是GET(所有在源码中的数据请求方式都是GET): http://www.cntour.cn,请求方式是GET(所有在源码中的数据请求方式都是GET)


END

时光,在物转星移中渐行渐远,春花一梦,流水无痕,没有在最想做的时候去做的事情,都是人生的遗憾。人生需要深思熟虑,也需要一时的冲动。