[TOC]
Python爬虫基础
简介
Python爬虫爬取的网页信息中,HTML是网站主体架构,CSS是网页的外观细节,JavaScript为页面处理动作,通过对HTML文本的分析来提取信息。
了解网页
以Python中文网首页(https://www.py.cn/)为例,抓取中国旅游网首页首条信息(标题和链接),数据以明文的形式出面在源码中。在Python中文网首页,按快捷键【Ctrl+U】打开源码页面,如图所示:
认识网页结构
网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JScript(活动脚本语言)。
HTML
HTML 是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的。
常见的标签如下:
CSS
CSS 表示样式,图 1 中第 13 行<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。
JScript
JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。
如果用人体来比喻,HTML 是人的骨架,并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏乐器等。
Python爬虫的基本原理
简介
网页请求的过程分为两个环节:Request (请求)和Response(响应),Python爬虫就是模拟这个行为,通过请求获取网页信息。
网页请求的过程分为两个环节:
Request (请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。
Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,就是我们所熟悉的网页请求,如图所示。
网页请求的方式也分为两种:
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,此时内容为空
在有道翻译中输入“我爱中国”,单击“翻译”按钮
在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据
单击 Headers,发现请求数据的方式为 POST。
找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。
爬取
首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下:
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。
Form Data 中的请求参数如图 15 所示:
将其复制并构建一个新字典:
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 库。
安装好 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)
Beautiful Soup 库能够轻松解析网页信息,它被集成在 bs4 库中,需要时可以从 bs4 库中调用。其表达语句如下:
from bs4 import BeautifulSoup
首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中,代码如下:
soup=BeautifulSoup(strhtml.text,'lxml')
接下来用 select(选择器)定位数据,定位数据时需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令
随后在浏览器右侧会弹出开发者界面,右侧高亮的代码(参见图 19(b))对应着左侧高亮的数据文本(参见图 19(a))。右击右侧高亮数据,在弹出的快捷菜单中选择“Copy”➔“Copy Selector”命令,便可以自动复制路径。
将路径粘贴在文档中,代码如下:
#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
时光,在物转星移中渐行渐远,春花一梦,流水无痕,没有在最想做的时候去做的事情,都是人生的遗憾。人生需要深思熟虑,也需要一时的冲动。