python 爬虫基础

一、Socket模块:

在导入socket时有两种方式,一个是import socket,然后在调用socket()方法的时候需要在前面加上socket.,如果是from socket import socket则不需要添加,因为已经导入了socket模块socket方法;当然另一个方式可以更简单,即from socket import *,导入socket模块所有的方法。

Python支持的套接字:AF_UNIX,AF_NETLINK,AF-INET(常用的基于网络的套接字)。

socket.socket()函数用于创建套接字。

socket.bind()函数用于绑定地址(主机,端口)到套接字。

socket.listen()函数用于开始TCP监听。

socket.accept()函数用于等待接收客户端的连接。

socket.connect()函数用于主动进行TCP连接。

socket.recv()函数用于接收TCP数据。

socket.send()函数用于发送TCP数据。

socket.sendall()函数用于完整发送TCP数据。

socket.close()函数用于关闭套接字。

二:requests模块

request模块用于构造模拟http消息的交互

url参数问题

当所构造的url要进行传参时,若为手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面例如:https://www.baidu.com/s?wd=value1&pn=value2
requests模块允许使用params进行传参,

import requests

keyword={'wd':'kali','pn':'10'}
r=requests.get('https://www.baidu.com/s',params=keyword)
print(r.url)
>>>>https://www.baidu.com/s?wd=kali&pn=10

响应内容

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
请求发出后,Requests会根据http头部对响应的编码进行判断,r.text会根据所判断的编码方式对响应体进行解码
r.encoding会显示request模块所使用的编码方式,并且可以用此方法更改响应体的解码方式

import requests
r = requests.get('https://api.github.com/events')
print(r.text)
print(r.encoding)
print(r.content)

r.content 为字节流编码显示响应体
r.encoding返回requests模块所用的编码方式

响应状态码

r.status_code 返回响应体的状态码

import requests
r = requests.get('https://api.github.com/events')
print(r.status_code)
>>>200

当发送错误请求时,可以使用Response.raise_for_status() 来抛出异常

>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error
响应头

headers在HTTP消息中为字典型数据结构,可以调用requests.headers.get(‘key’)对响应头进行查询

>>> r.headers['Content-Type']
'application/json'

>>> r.headers.get('content-type')
'application/json'

cookie问题

概念:

cookie,一种口令机制,用于维持浏览器访问服务器状态的口令机制
服务器可以利用这种机制识别同一用户,并记录该用户产生窗口的状态
从而可以实现会话跟踪,并记录用户的行为。

基本原理:

1.当一个浏览器访问某web服务器时,web服务器会在响应头中添加一个名叫Set-Cookie的响应字段用于将Cookie返回给浏览器,当浏览器第二次访问该web服务器时会自动的将该cookie回传给服务器,来实现用户状态跟踪。(http协议本身为静态协议,不能实现状态跟踪功能)
2.cookie的domain和path属性定义了cookie的作用范围,即访问哪些网站或url时,会自动的带着该cookie。
domain即域名,默认是当前主机(不包括子域名)
path默认是*(所有路径),即域名后面的的路径。大部分情况下我们都是使用默认的设置即可。

jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
print(r.text)
print(r.url)

此处的domain为httpbin.org域名(此域名为GitHub上一开源项目,用于测试HTTP实验)path设为/cookies(/elsewhere)

cookie在request模块中的应用:

1.当请求响应中存在有cookie时,可以调用

url = 'http://www.baidu.com'
r = requests.get(url)
print(r.cookies)
》》》<RequestsCookieJar[<Cookie ###### for .baidu.com/>]>

来查看响应中的cookie值
2.若要发送cookie至目标服务器,则可以使用r.requests.get(url=url,cookie=cookie)参数来进行发送

url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')

r = requests.get(url, cookies=cookies)
r.text
'{"cookies": {"cookies_are": "working"}}'

cookie返回的对象为RequestCookiejar
使用RequestCookiejar可以利用更多的接口,适合跨域名跨路径使用

jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
print(r.text)
print(r.url)
》》》{
  "cookies": {
    "tasty_cookie": "yum"
  }
}

http://httpbin.org/cookies

若想对cookie进行详细了解,请移步笔者另一博文

解码编码问题

r.text:返回字符串形式的响应体
r.content:返回字节形式的响应体

import requests

r = requests.get(url='http://www.baidu.com')  # 最基本的GET请求
print(r.status_code)  # 获取返回状态
r = requests.get(url='http://www.baidu.com/s', params={'wd': 'python'})  # 带参数的GET请求
print(r.url)
print(r.text)  # 打印响应体
》》》
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>百度安å
¨éªŒè¯</title> 		#发现打印出来为乱码

因为网站的网页为gzip压缩过的数据,不可以直接打印,要先进行解压缩
r.content()方法可以对响应体进行gzip/deflate解压操作,

print(r.content)
#打印出未解码的响应体
print(r.content.decode('utf-8'))
#打印解码之后的响应体

在这里插入图片描述

e>\xe7\x99\xbe\xe5\xba\xa6\xe5\xae\x89\xe5\x85\xa8\xe9\xaa\x8c\xe8\xaf\x81</title>\n  

这些都为十六进制文本,是python内部编码uncoide的编码格式。即:响应体通过content()解压缩之后,在python内部为uncoide编码,可以对其进行utf-8解码操作,得到字符响应体
decode(‘utf-8’)的意思就是将当前的unicode编码转换成utf-8编码
编码解码问题:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值