引言:

一个网络爬虫的编写主要可以分为三个部分:

1.获取网页

2.提取信息

3.分析信息

本文主要介绍第一部分,如何用Python内置的库urllib和第三方库requests库来完成网页的获取。阅读完本文后,读者将能利用这2个库获取一个网页的HTML代码。

但是首先,我们需要一点网络方面的基本知识,才能更好的理解爬虫。

为此,读者应该理解以下知识:

1.什么是HTTP,HTTP报文及其格式

2.请求报文的几种方法

3.header(首部)常用字段

4.HTTP如何保存会话信息,cookie和session

本文第一部分网络基础会讨论这些问题

一、网络基础

1.什么是HTTP,HTTP报文及其格式

超文本传输协议(HTTP,HyperText Transfer Protocol)位于OSI四层模型中的应用层协议。设计该协议的主要目的就是为了HTML的发送和接收。它基于TCP/IP协议。一次完整的HTTP事务包含以下过程:

1)当我们在浏览器输入网址后,首先经过DNS服务器,解析域名,得到我们要获取的服务器IP,端口,已经资源的路径

2)TCP三次握手,建立连接

3)客户端发起HTTP请求报文

4)服务器接受到客户端的请求报文,返回一个响应报文

5)浏览器收到响应报文,解析HTML,CSS

HTTP报文的三个组成部分(起始行,首部,主体)。

起始行和首部是ASCII文本。每行用CRLF作为终止(回车ASCII13和换行ASCII10)主体是可选数据块,可包含文本或二进制数据,也可为空。

报文主要分为请求报文和响应报文。

请求报文格式

  1. <method><request-URL><version>
  2. <headers>
  3. <entity-body>

响应报文格式

  1. <version><status><reason-phrase>
  2. <headers>
  3. <entity-body>

一个获取gif图的例子:

  1. GET /specials/saw-blade.git HTTP/1.0
  2. Host: www.joes-hardware.com
  3. HTTP/1.0 200 OK
  4. Content-Type: image/git
  5. Content-Length: 8572
  • method:客户端希望服务器对资源执行的动作。GET/HEAD/POST
  • request-URL:命名了所请求的资源。
  • version:格式看起来是这样的 HTTP/.
  • status-code:三位数字描述了请求所发生的情况
  • reason-phrase:原因短语,数字状态码的可读版本。只对人类有意义,还是以status-code为准
  • header:可有0个或多个。每个首部包含:一个名字,冒号,一个可选的空格,值,最后是一个CRLF。一组HTTP首部应该总以一个空行(单个CRLF)结束。
  • entity-body:由任意数据组成的数据块。如果不包含实体的主题部分,以一个CRLF结束

2.请求报文的几种方法

GET是HTTP的默认请求方式

POST一般用来上传文件或表单

HEAD获取某个URI响应头信息,基本与GET相同但是不返回响应主体。

PUT通过提供的URI获取到特定的内容主体,如果存在则修改内容,如果不存在则创建。

DELETE通过URI删除指定内容TRACE返回接受到的请求,用来查看数据经过中间服务器时发生了哪些变动

OPTIONS返回给定URL支持的所有HTTP方法

CONNECT要求使用SSL和TLS进行TCP通信

PATCH请求修改局部数据

Python爬虫对GET和POST方法使用的较多。

3.header(首部)常用字段

Accept

Accept-Encoding

Accept-Language

Connection

Host

Cache-control

User-Agent

Upgrade-Insecure-Requests

Cookies

Referer

Accept-Charset

If-Modified-Since

Pragma

Range

4.HTTP如何保存会话信息,cookie和session

HTTP是一种无状态的协议。

假设我们登陆一个网站,填完用户名和密码,然后点击提交按钮,浏览器发送了一个POST请求给服务器。服务器去查找数据库,比对用户名和密码成功后,返回一个响应报文,登陆成功,这一次HTTP事务结束。等用户再次发送一个请求,服务器也收到了这个请求,但是因为HTTP的无状态,服务器无法分辨这个报文是来自谁的。

所以,为了能够让服务器知道这个请求的发送者和上次发送POST请求的发送者是同一个,我们需要标识用户的身份,来方便服务器辨认。

对于服务器而言,我们需要有一个保存上下文的机制。session正是这样一种机制。对于每个用户产生的信息,服务器会以变量的方式保存下来,而每个用户都有一个ID,我们称为sessionID。

但是仅有服务器的sessionID是没用的。就像你去图书馆借书,图书馆有你借书证的信息,但你没带借书证,就无法证明自己的身份信息。同样,客户端要证明自己的身份,就需要在请求报文中包含sessionID。对此,我们有以下几种方式。一种是URL重写,直接在URL中包含sessionID;一种是在表单中设置一个隐藏字段,将sessionID放在隐藏字段中提交表单,还有一种就是使用cookie。

和session放在服务器相对,cookie作为一段数据储存在本地客户端。服务器在生成sessionID后,会再响应报文中包含set-cookie字段。客户端从中解析出cookie信息。之后在发请求报文时,将cookie加在报文里面发出去,服务器就能辨认这个请求报文的发送者是谁了。

二、urllib库和requests库的使用

1.urllib库

urllib是Python3中的内置库,将Python2中的urllib和urllib2合二为一。

urllib有四个重要属性:error,parser,request,response

下面介绍一些比较常用的方法:

urllib.request.urlopen

  1. def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TI
  2. MEOUT,*, cafile=None, capath=None,
  3. cadefault=False, context=None):
  4. pass

data参数常用在POST请求,是一个byte object.我们可以先写成字典格式,然后用urllib.parse.urlencode()转换

timeout是超时时间,单位是秒

该函数返回一个类文件对象。该对象有如下常用方法:

read:读出html

geturl:返回url,常用来看是否重定向

info:返回元信息,例如headers

getcode:返回HTTP状态码

urllib.request.Request

  1. class Request:
  2. def __init__(self, url, data=None, headers={},
  3. origin_req_host=None, unverifiable=False,
  4. method=None):

headers用来写头部信息如user-agent,来伪装成浏览器发出的请求。

一个例子:

  1. from urllib import request, error, parse
  2.  
  3. try:
  4. headers = {'Accept':'text/html, application/xhtml+xml, image/jxr, */*',
  5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
  6. 'Accept-Language': 'zh-Hans-CN,zh-Hans;q=0.5'}
  7. value = {'source':'index_nav',
  8. 'form_email':'user', #这里是豆瓣用户名
  9. 'form_password':'passwd'} #这里是密码
  10. data = parse.urlencode(value).encode('utf-8')
  11. req = request.Request('https://www.douban.com', headers=headers, data=data)
  12. res = request.urlopen(req)
  13. print(res.read().decode('utf-8'))
  14.  
  15. except error.HTTPError as e:
  16. print('http error.')
  17. except error.URLError as e:
  18. print('url error')

urllib.error.HTTPError和urllib.error.URLError

  1. from urllib import request, error
  2.  
  3. try:
  4. header = {'user-agent': r'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0'}
  5. req = request.Request('http://www.baidu.com', headers = header)
  6. res = request.urlopen(req)
  7. print(res.read().decode('utf-8'))
  8. except error.HTTPError as e:
  9. print('http error.')
  10. except error.URLError as e:
  11. print('url error.')

urllib.request.proxyHandle

设置代理ip信息。用以下代码替换urlopen

  1. # 创建代理字典
  2. proxy={'http':'115.2.332.1:8081'}
  3. # 使用ProxyHandler方法生成处理器对象
  4. proxy_handler=request.ProxyHandler(proxy)
  5. # 创建代理IP的opener实例
  6. opener=request.build_opener(proxy_handler)
  7. html = opener.open(req)

2.requests库

requests库是第三方库,需要安装。如果你有pip工具,可以执行‘pip install requests’安装

参考资料:

《HTTP权威指南》

“解读爬虫中HTTP的秘密”

Requests文档

【Python爬虫】HTTP基础和urllib库、requests库的使用的更多相关文章

  1. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  2. 3.Python爬虫入门三之Urllib和Urllib2库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

  3. Python爬虫小白入门(二)requests库

    一.前言 为什么要先说Requests库呢,因为这是个功能很强大的网络请求库,可以实现跟浏览器一样发送各种HTTP请求来获取网站的数据.网络上的模块.库.包指的都是同一种东西,所以后文中可能会在不同地 ...

  4. python爬虫知识点总结(四)Requests库的基本使用

    官方文档:http://docs.python-requests.org/en/master 安装方法 命令行下输入:pip3 install requests.详见:https://www.cnbl ...

  5. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页

    Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...

  6. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  7. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  8. 转 Python爬虫入门三之Urllib库的基本使用

    静觅 » Python爬虫入门三之Urllib库的基本使用 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器 ...

  9. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

  10. 小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. eatwhatApp开发实战(五)

    上次我们为eatwhat添加了了删除功能和dialog对话框的介绍,今天我们来使用SQLite进行本地数据存储. 首先,我们定义一个SQL辅助类ShopInfoOpenHelper继承SQLiteOp ...

  2. [PHP学习教程 - 网络]003.获得当前访问的页面URL(Current Request URL)

    引言:获取当前请求的URL路径,自动判断协议(HTTP or HTTPS). 一句话的事情,下面直接上高清无MSK的精妙代码! 功能函数 获得当前请求的页面路径(URL)地址 语法:$url = ge ...

  3. 在线编写复杂的数学公式--EdrawMath

    网址: EdrawMath , 非常好用

  4. Parrot os安装nvidia失败恢复

    因为两种显卡,amd和nvidia,所以按照parrot官方文档安装驱动,结果可想而知,安装失败--- 内心万马奔腾,去国外论坛也发现很多求助的小伙伴,所以有了我这次随笔,如何恢复你的parrot 黑 ...

  5. cpprestsdk同时使用boost.asio,acceptor就一直报Invalid argument。

    本文目录,首先总结问题,然后案例还原. 总结: 问题的根本在于boost.asio作为header-only库,运行程序与动态库之间容易因为版本错配而产生运行期莫名其妙的问题. cpprestsdk使 ...

  6. jchdl - RTL实例 - AndReg

    https://mp.weixin.qq.com/s/p4-379tBRYKCYBk8AZoT8A   输入两组线相与,结果输出到寄存器.   参考链接 https://github.com/wjcd ...

  7. Chisel3 - Tutorial - Stack

    https://mp.weixin.qq.com/s/-AVJD1IfvNIJhmZM40DemA   实现后入先出(last in, first out)的栈.   参考链接: https://gi ...

  8. Java实现 蓝桥杯 算法训练 字符串长度(IO无敌)

    试题 算法训练 字符串长度 问题描述 输入一个字符串,输出其长度. 输入格式 输入一个字符串 输出格式 输出字符串长度 样例输入 一个满足题目要求的输入范例. HelloWorld 样例输出 10 数 ...

  9. Java实现第八届蓝桥杯图形排版

    标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...

  10. Java实现 蓝桥杯VIP 算法提高 文化之旅

    算法提高 文化之旅 时间限制:1.0s 内存限制:128.0MB 问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不 ...