Python网络爬虫学习笔记 - 第二章:爬虫基本库的使用

课程地址 https://edu.csdn.net/course/detail/24756/280664

网络请求

urllib库 —— 内置

urlopen函数

创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
- url:请求的url。
- data:请求的data,如果设置了这个值,那么将变成post请求。
- 返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。

urlretrive函数

这个函数可以方便的将网页上的一个文件保存到本地。

request.urlretrive(url, 文件名)

urlencode函数:编码

urlencode可以把字典数据转换为URL编码的数据。

from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':100} qs = parse.urlencode(data)
print(qs)

parse_qs函数:解码

可以将经过编码后的url参数进行解码。

from urllib import parse qs="name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+wo rld&age=100"
print(parse.parse_qs(qs))

urlparse和urlsplit:解析url

有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使 用urlparse或者是urlsplit来进行分割。urlparse和urlsplit基本上是一模一样的。 唯一不一样的地方是: urlparse里有params属性,而urlsplit没有这个params属性。

from urllib import parse

url = 'http://www.baidu.com/index.html;user?id=S#comment'
#result = parse.urlparse(url)
result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
#urlparse里有params属性,而urlsplit没有这个params属性。
print(result.params)

request.Request类:网络请求 可以增加请求头

如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。 比如要增加一个User-Agent

from urllib import request

header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}

url = request.Request('https://www.baidu.com', headers=header)
rq = request.urlopen(url)
print(rq.read())

ProxyHandler处理器(代理设置):封ip问题

  1. 代理原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的的网站的数据后,再转发给我们的代码。
  2. http://httpbin.org:这个网站可以方便的查看http请求的一些参数
  3. 在代码中使用代理 示例:
#使用代理
#步骤
from urllib import request

url = 'http://httpbin.org/ip'
#1. 使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({'http':'113.194.20.35:9999'})
#2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
#3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())

cookie

什么是cookie: 指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据
cookie的格式:
Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH; Domain=DOMAIN_NAME;SECURE
参数意义:
NAME: cookie的名字。
VALUE: cookie的值。
Expires: cookie的过期时间。
Path: cookie作用的路径。
Domain: cookie作用的域名。
SECURE: 是否只在https协议下起作用。

cookie加载与保存

from urllib import request
from http.cookiejar import MozillaCookieJar

#save
"""
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
opener.open('https://www.baidu.com')
resp = cookiejar.save(ignore_discard=True, ignore_expires=True)
"""

#load
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open("https://www.baidu.com")

for cookie in cookiejar:
    print(cookie)

requests库 —— 第三方库

Requests: 让HTTP服务人类

安装和文档地址

pip install requests
中文文档:http://docs.python-requests.org/zh_CN/latest/index.html 
github地址:https://github.com/requests/requests

发送GET请求

import requests

#添加headers和查询参数
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}
kw = {'wd':'中国'}
resp = requests.get('https://www.baidu.com/s', headers=headers, params=kw)
print(resp)
print(resp.text)
print(resp.content)
print(resp.content.decode('utf-8'))

发送POST请求

response = requests.post("https://www.baidu.com/", data=data)

POST请求方式

import requests

url = 'https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
data = {
    'redirect': 'https://www.meishij.net/',
    'username': '1097566154@qq.com',
    'password': 'wq15290884759.'
}
resp = requests.post(url,headers=headers,data=data)
print(resp.text)

使用代理

使用requests添加代理也非常简单,只要在请求的方法中(比如get或者post)传递 proxies参数就可以了。

import requests

proxy = {'http': 'http://116.209.53.228:9999'}
url = 'http://httpbin.org/ip'
resp = requests.get(url, proxies=proxy)
print(resp.text)

cookie

基本使用:模拟登录

import requests

resp = requests.get("https://www.baidu.com")
print(resp.cookies)
print(resp.cookies.get_dict())

url = 'https://www.zhihu.com/hot'
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36', 'cookie': '_zap=a9d67997-be95-44c4-9980-b54a962aadf6; _xsrf=ISyaE3vjampbTKBffIVXrrZRcIlVAz6G; d_c0="ADCR8BrmnxGPTpkk4V7ynT4R6mkjqcE496o=|1595568406"; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1595568406; _ga=GA1.2.1604085436.1595568407; _gid=GA1.2.689071854.1595568407; capsion_ticket="2|1:0|10:1595568433|14:capsion_ticket|44:ZTAzMTg3MjYyN2Q2NDY0NmFmMWE0NmRhNGYwMzZkZGI=|97805e1fab46de6b1583eebf0eb8c85d4bfbdcb8098569e7cfe1f150d3743e0c"; SESSIONID=MIOkGNudukbyCkQsijzhwHfz3fjUpRYij6uPCucdswF; JOID=U1wSBEyH-yxhPw8ZN4Fo9x0j74Ugz7FjCn5Eb1P0lU0YfGJNR7OJNjg8CRo35USMAMr_3mVW4huP42hHOh-HiUM=; osd=Wl4TBEKO-S1hMQYbNoFm_h8i74spzbBjBHdGblP6nE8ZfGxERbKJODE-CBo57EaNAMT23GRW7BKN4mhJMx2GiU0=; z_c0="2|1:0|10:1595568460|4:z_c0|92:Mi4xOFA3MEFBQUFBQUFBTUpId0d1YWZFU1lBQUFCZ0FsVk5UTDhIWUFEdUZsX0xLOW52TEduSU1YZzlTSFVIblRzOXBB|7029f72f4f814806a75beb587b289389959e454aa0094ca8d946f21237d3fdd4"; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1595568462; tst=h; tshl=; KLBRSID=e42bab774ac0012482937540873c03cf|1595568476|1595568405',
            'cookie':填入cookie}
resp = requests.get(url, headers=headers)
print(resp.text)

session:共享cookie

案例:

post_url = 'https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F'

post_data = {
    'username':'1097566154@qq.com',
    'password':'wq15290884759.'
}
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}

# 登录
session = requests.session()
session.post(post_url,headers=headers,data=post_data)


#访问个人网页
url = 'https://i.meishi.cc/cook.php?id=13686422'

resp = session.get(url)
print(resp.text)

处理不信任的SSL证书

对于那些已经被信任的SSL证书的网站,比如https://www.baidu.com/,那么使用 requests直接就可以正常的返回响应。示例代码如下:

resp = requests.get('https://inv-veri.chinatax.gov.cn/',verify=False) print(resp.content.decode('utf-8'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值