最简单的爬虫

首先介绍一下html,HTML是hyperText Markup Language
的缩写,又叫超文本标记语言,一个网页大部分是由HTML代码组成,HTML是一门制作网页的语言,我们如果要从网页上获取我们需要的信息,就要先看它的HTML,那么如何用Python看一个网页的HTML呢,很简单

import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()

这里爬下来的代码太多我就不展示了,最简单的爬虫就是这样,然而这并不是我们想要的,别急,慢慢来

分析源代码

response = urllib2.urlopen

这里用的是urllib2的urlopen方法我们先来看一下这个方法的原型
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
cafile=None, capath=None, cadefault=False, context=None): 这个方法需要传入一个URL,还可以传入需要查询的数据data,还有超时时间例如 response = urllib2.urlopen


在这个response 对象中有一个read()方法返回了读取到的内容
我们来试一下如果没有read()方法直接打印response会是什么结果
运行后是这样的
`>’
这里打印的是response对象

Reques请求
`

urlopen方法可以直接传入Request类的一个实例
比如

import urllib2 request = urllib2.Request
response = urllib2.urlopen(request)
print response.read()`

这里的request就是Request类的一个实例这样打印的结果和上面的结果是一样的那么为什么要使用request呢,因为后面我们会讲到,服务器在接收URL 时还需要接收其他数据来判断向我发送请求的是不是浏览器,这就是所谓的反爬虫技术,然而只要浏览器能做到的爬虫都可以做到,只要技术过关在与反爬虫的斗争中,永远都是爬虫的那一方胜利的
简单介绍一下request的作用,后面会具体讲解,request实例有一个add_header方法可以添加请求头,比如要添加User-Agent就可以这样

request.add_header('User-Agent', 'fake-client')

请求方式

网页中的最常用的数据传送分为POST和GET方式那么GET和POST两种方式有什么区别呢

POST方式

  • 地址栏不会改变。请求参数放在请求实体内容中。参数之间用&分割。
  • 适合传递敏感数据,比如密码。
  • POST方式提交没有限制的。

GET方式

  • 地址栏会发送改变。请求参数会跟在URI后面。参数以?开头,参数之间用&分割
  • 不合适传递敏感数据
  • GET方式提交内容有限制的,不超过1kB。

POST方式的请求内容是跟着HTTP请求走的,而GET方式会在URL 中显示出来

我们以学校的教务系统为例讲解一下GET和POST 进入选课登录页面,按下F12打开开发者工具右侧栏点到network选项

python 读h5文件 python read_html_html

点击登录,登录成功后network检测到数据传输,如下图所示

python 读h5文件 python read_html_爬虫_02

最下面我们看到From Data 这里就是我们刚才在登录栏填写的 用户名和密码,这就是属于POST方式,以后我们在做模拟登录的时候也会用到


HTTP请求

我们来分析一下这次过程中Request Headers中的内容
Accept:text/html,application/xhtml+xml,… –浏览器接收的数据类型
Accept-Encoding:gzip, deflate –浏览器接收的数据压缩格式
Accept-Language:zh-CN,zh;q=0.8 —浏览器接收的语言
Cache-Control:max-age=0
Connection:keep-alive —浏览器和服务器的连接状态
Content-Length:58
Content-Type:application/x-www-form-urlencoded
Cookie:ASPSESSIONIDASRDCSSS… -保存的cookies值
SERVERID=bkjwServer
Host:bkjw.guet.edu.cn —请求发出的主机
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 —浏览器类型

HTTP响应

Location:menu.asp?menu=mnall.asp –重定向的地址
Status Code:302 Object moved –响应的状态码 302表示重定向
server –服务器类型