引言:

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

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)主体是可选数据块,可包含文本或二进制数据,也可为空。

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

请求报文格式

<method><request-URL><version>
<headers> <entity-body>

响应报文格式

<version><status><reason-phrase>
<headers> <entity-body>

一个获取gif图的例子:

GET /specials/saw-blade.git HTTP/1.0
Host: www.joes-hardware.com HTTP/1.0 200 OK
Content-Type: image/git
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

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

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

timeout是超时时间,单位是秒

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

read:读出html

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

info:返回元信息,例如headers

getcode:返回HTTP状态码

urllib.request.Request

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

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

一个例子:

from urllib import request, error, parse

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

urllib.error.HTTPError和urllib.error.URLError

from urllib import request, error

try:
header = {'user-agent': r'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0'}
req = request.Request('http://www.baidu.com', headers = header)
res = request.urlopen(req)
print(res.read().decode('utf-8'))
except error.HTTPError as e:
print('http error.')
except error.URLError as e:
print('url error.')

urllib.request.proxyHandle

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

    # 创建代理字典
proxy={'http':'115.2.332.1:8081'}
# 使用ProxyHandler方法生成处理器对象
proxy_handler=request.ProxyHandler(proxy)
# 创建代理IP的opener实例
opener=request.build_opener(proxy_handler)
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. Html响应式图片

    Html响应式图片 1.介绍:根据屏幕匹配的不同尺寸显示不同图片,picture 元素允许我们在不同的设备上显示不同的图片,一般用于响应式 <!-- 在不同的屏幕尺度下显示不同的图片 --> ...

  2. PIC单片机的定时器

    PIC单片机的定时器有3个 timer0 timer1 timer2 定时器的计算方法 256*k*Tcy=定时时间 (256-Init-value)*k*Tcy=定时时间

  3. 才华能力出众的ReentrantLock

    主要内容 1. synchronized介绍 2. ReentrantLock介绍 3. ReentrantLock和synchronized的可伸缩性比较 4. Condition变量 5. Ree ...

  4. SD.Team颜色代码大全

    EEEEEE FFCCFF FF66FF FF00FF DDDDDD FFCCCC FF66CC FF00CC CCCCCC FFCC99 FF6699 FF0099 BBBBBB FFCC66 FF ...

  5. 遍历集合(Collection)的方法

    使用增强for循环和迭代器遍历集合 package com.aff.coll; import java.util.ArrayList; import java.util.Collection; imp ...

  6. SDP架构初识

    实现零信任的框架主要有SDP和Google Beyondcorp模型,前者出现在乙方的安全解决方案中,后者多作为甲方落地零信任的参考.本文主要记录对SDP技术的一些初步认识. 一.SDP简介 SDP是 ...

  7. 副业收入是我做程序媛的3倍,工作外的B面人生

    到“程序员”,多数人脑海里首先想到的大约是:为人木讷.薪水超高.工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是 ...

  8. 本地安装JDK1.7和1.8,可相互快速切换

    1.JDK官网下载jdk1.7和jdk1.8 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 2.将jdk1.7 ...

  9. Rocket - regmapper - RegField

    https://mp.weixin.qq.com/s/7WKB1QxcVzqm2Q7bWcKHzA 简单介绍RegField的实现. 1. 简单介绍 定义寄存器域相关的参数类型. 2. RegFiel ...

  10. 字符串去除空格的方式(用replace()实现)

    去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g,"") ...