python爬虫-初识爬虫

学习python的爬虫需要的基础知识

  1. python语言基本知识
  2. python环境配置的基本知识
  3. python面向对象的基本知识
  4. 正则表达式

http与https协议

学习应用层协议http和https需要知道的常见的应用架构
c/s client server 客户端 服务端 :网络游戏
b/s browser server 浏览器 服务端 :淘宝,天猫
m/s mobile server 移动端服务端 :王者荣耀

http协议:

目前,90%以上 的网络传输都是基于http(Hyper Text Transfer Protocol)超文本传输协议,是用于在万维网从服务器传输超文本到本地浏览器的传输协议,它基于底层(传输层)的TCP/IP协议来传递数据(html,图片文件,查询结果)

http请求流程:

一次http请求的基本流程是,有客户端向服务端发起一次请求(request),而服务器在接收到以后返回给客户端一个响应(response)。所以一次完整的http请求包含请求和响应两部分。默认的http协议端口为80端口。
发送http请求时,通过url对网络资源进行定位。URL(Uniform Resource Locator),全球统一资源定位符,用来标识某一处资源的地址,也就是网址。以下是url的组成:
在这里插入图片描述
因为http协议的默认端口都是80,所以在输入网址时不需要搜索端口号。路径即为资源内部的url,?之后的部分是参数,根据参数访问具体的资源。
应用socket 建立一个python形式的服务器测试:

import socket
#导入socket包
server  = socket.socket()
#建立一个socket服务器
server.bind(('0.0.0.0',8080))
#绑定ip 和端口
server.listen(5)
#设置监听
while True:
	conn,addr = server.accept()
	#接收数据
	data = conn.recv(1024)
	print(data)

以下展示了接收到的数据,将其打印在了终端
在这里插入图片描述

http请求:

客户端发送一个http请求到服务器的请求消息包括以下部分:请求行请求头空行请求数据,下图给出请求报文的一般格式,对比上图打印出的数据进行观察:
在这里插入图片描述

http请求方法:

根据http标准,http请求可以使用多种请求方法。
1.0定义了三种请求方法:GET,POST和HEAD方法
1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
以下是对各种方法的描述:
在这里插入图片描述
常用的方法是GET和POST,其实简单来说,GET方法一般用来负责获取数据,或者将一些简短的数据放到URL参数中传递到服务器,比POST更加高效和方面。
由于GET方法最多再URL中携带1024字节数据,且将数据放到URL中传递太不搭安全,数据量大时URL也会变得冗长。所以传递数据量大或者安全性要求高的数据的时候,最好使用POST方法来传递数据。

请求头:

请求行的下方则是请求报头,每个报头的形式如下:
名字 + : 空格 + 值
请求头往往包含很多项:
User-Agent

请求正文由一个空行隔开

发送数据:
import socket
#导入socket包
server  = socket.socket()
#建立一个socket服务器
server.bind(('0.0.0.0',8080))
#绑定ip 和端口
server.listen(5)
#设置监听
while True:
    conn,addr = server.accept()
    #接收数据
    data = conn.recv(1024)
    print(data)
    #发送数据
    conn.send('HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nSec-Fetch-Site: none\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nCookie: csrftoken=sag002QX6qf00BvKnNCoixvutyOAdTjdi7IBfxgMeuzFvMFufzZ3Rm4d7gP0DbHn\r\n\r\n<h1 style="color:red">这是一个web服务器</h1>'.encode('GB2312'))
    conn.close()

此服务器会返回一些数据,通过send方法,将请求头和返回内容通过字符串返回,注意需要对字符串用encode()方法进行编码,由于正文内容是中文“这是一个Web服务器”,因此需要用中文编码GB2312,在浏览器中输入http://127.0.0.1:8080,则返回服务器响应发送的数据:
在这里插入图片描述

http响应:

http响应也由四个部分组成,分别是状态行消息报头空行响应正文
当客户端向服务端发起一次请求后,服务端在返回头中包含一个HTTP状态码,HTTP的状态码是由三位数字来表示的,由第一位数字表示状态码的类型,一般来说由五种类型:
在这里插入图片描述

http协议的注意事项:
  1. 无连接:无连接的含义是每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  2. 媒体独立:这意味着,只要客户端和服务器知道如何处理数据内容,任何类型的数据都可以通过http发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  3. 无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要处理先前信息时它的应答就较快
https协议:

超文本传输安全协议,即为超文本传输协议的安全版,原本的http发送的信息都是明文的,容易被黑客劫持,为了解决信息透明的问题,在http协议的基础上加了一层SSL/TLS协议。HTTPS协议下,数据在传输过程中是加密的,服务端需要在相关公司申请证书,在传送数据时会验证证书是否合法,对数据进行加密。HTTPS协议的默认端口是443。

爬虫概念

到底什么是爬虫?
网络爬虫也叫网络蜘蛛,它特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。
更加专业和全面对爬虫的定义是:网络爬虫是伪装成客户端与服务端进行数据交互的程序。
爬虫的应用?
1.数据采集
大数据时代来临,数据就是核心,数据就是生产力,越来越多的企业开始注重收集用户数据,而爬虫技术是收集数据的一种重要手段。
2.搜索引擎
百度,谷歌等搜索引擎都是基于爬虫技术。
3.模拟操作
爬虫被广泛用于模拟用户操作,测试机器人,自动化测试等。

爬虫开发的难点:

1.数据的获取
网络公共资源都是为用户准备的,为了避免被爬虫采集,服务端会设置非常多的图灵测试,阻止爬虫的恶意爬取,也就是反爬措施。爬虫开发工程师在开发爬虫时,需要解决这些反爬措施。我们在开发爬虫的过程中,有很大一部分的工作就时处理这些反爬措施。
2.采集的速度
大数据时代,需要巨大的数据量,动辄千万条的级别,甚至上亿条。如果采集速度跟不上,耗时过长,就达不到商业要求。一般我们会采取并发以及分布式来解决速度上的问题。这也是爬虫开发过程中的另外一个重心。
接下来是用socket作为客户端简单模拟爬虫下载百度首页的程序:

import socket
# 创建客户端
client = socket.socket()
# 连接百度服务端
client.connect(('www.baidu.com',80))
# 构造http请求报文
data = b'GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n'
# 发送报文
client.send(data)

res = b''
# 接收响应数据
temp = client.recv(4096)

while temp:
    print('*******************')
    res += temp
    # print(temp)
    temp = client.recv(4096)

print(res)

在终端打印的res即为状态行加粗样式+响应报头+空行+百度首页的html文本
在这里插入图片描述

会话技术

到底什么是会话技术?
http是无状态的,那服务端怎么区分同一个用户的连续请求呢,这就用到了会话技术:cookiesession
Cookie有时也用其复数形式Cookies,英文是饼干的意思。指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。最新的规范是RFC6265。
Cookie其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存储在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。服务器在接收到Cookie以后,会验证Cookie的信息,以此来辨别用户的身份。因此Cookie可以理解为一个凭证,数据形式为键值对。
Session,在web领域,一般使用的是其本义,一个浏览器窗口从打开到关闭这个期间。
Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发送的所有请求都可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个cookie,SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID并且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。因此session是基于cookie的
Session与Cookie相反,Session是存储在服务器上的数据,只由客户端传上来的SessionID进行判定,所以相对于Cookie,Session的安全性更高。
一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。

通过socket下载一张图片

浏览器的开发者工具

首先我们需要了解一下浏览器的开发者工具,这里以谷歌浏览器为例,快捷键F12,或在更多工具里找到开发者工具,这里以一个图片网站为例,进入该网站,则产生了请求和响应,通过开发者工具可以观察到返回回来的数据:
在这里插入图片描述
Network一栏可以观察到返回的数据,每一个文件都是一次请求和响应,双击选中一个文件,可以观察返回报文的头部:响应头,请求头,以及预览响应Cookies消耗时间
头部:在这里插入图片描述
预览:
在这里插入图片描述
响应:
在这里插入图片描述
Cookies:
在这里插入图片描述
时间:
在这里插入图片描述

用socket获取一张图片
'''
利用 socket 下载一张图片
'''
import socket
# 创建一个socket
client = socket.socket()
# 图片的url
img_url = 'https://t1.hddhhn.com/uploads/tu/201904/233/4785gf.jpg'
# 构造 http请求报文
data = 'GET /uploads/tu/201904/233/4785gf.jpg HTTP/1.1\r\nHost: t1.hddhhn.com\r\n\r\n'
# 连接服务端
client.connect(('t1.hddhhn.com',80))
# 发送请求
client.send(data.encode())   # 注意编码为二进制
# 接收响应
while True:
    res = client.recv(1024)
    if res:
        print(res)
    else:
        break

注意:
构造的http请求报文的格式
发送报文需要以二进制形式

以下是程序运行结果
在这里插入图片描述
由于windows系统限定,每次请求只能获得1024Bytes即1KB的数据,因此我们需要获取整个数据的大小,在返回的响应报头中有一个响应项:Content-Length: 178\r\n,利用正则表达式可以对其进行搜索,获得Content-Length的值,从而获取完整的数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值