热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python使用get和post方法_Python爬虫之GET和POST请求然后正确运用详解

爬虫——GET请求和POST请求urllib.parse.urlencode()和urllib.parse.unquote()编码工作使用urllib.parse的urlenc

5d1d932058ee6139.jpg

爬虫——GET请求和POST请求

urllib.parse.urlencode()和urllib.parse.unquote()

编码工作使用urllib.parse的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。

# python3.5控制台中测试结果

>>> import urllib

>>> word = {"wd":"爬虫"}

# 通过urllib.parse.urlencode()方法,将字典键值对按URL编码转换,从而能被wed服务器接受。

>>> urllib.parse.urlencode(word)

'wd=%E7%88%AC%E8%99%AB'

# 通过urllib.parse.unquote()方法,把URL编码字符串,转换回原先的字符串。

>>> urllib.parse.unquote(word)

'wd=爬虫'另外注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!

一般HTTP请求提交数据,需要编码成URL编码格式,然后做为URL的一部分,或者作为参数传到Request对象中。

GET方式

GET请求一般用于我们向服务器获取数据,比如说,我们用百度搜索 爬虫:https://www.baidu.com/s?wd=爬虫(https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB)

我们可以看到在请求部分里,http://www.baidu.com/s? 之后出现一个长长的字符串,其中就包含我们要查询的关键词“爬虫”,于是我们可以尝试用默认的GET方式来发送请求。

#!/usr/bin/python3

# -*- coding:utf-8 -*-

# 导入库

import urllib.request

import urllib

url = "http://www.baidu.com/s?"

word = {"wd":"爬虫"}

# 转换成url编码格式

word = urllib.parse.urlencode(word)

# 拼接成完整的url

full_url = url + word

# chrome 的 User-Agent,包含在 header里

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}

# url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent

request = urllib.request.Request(full_url, headers = header)

# 向服务器发送这个请求

response = urllib.request.urlopen(request)

html = response.read()

fo = open("baidu.html", "wb")

fo.write(html)

fo.close()

批量爬取贴吧页面数据

首先我们创建一个python文件:tiebaSpider.py,我们要完成的功能是,输入一个百度贴吧的地址,比如:百度贴吧LOL吧

第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

第二页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

第三页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

……

爬取以上页面的内容

相关推荐:《Python相关教程》

#!/usr/bin/python3

# -*- coding:utf-8 -*-

"""

功能:批量爬取贴吧页面数据

目标地址:百度贴吧LOL吧

分析:

第一页:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

第二页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

第三页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

……

规律:

贴吧中每个页面URL不同之处,就是最后的pn值,其余的都是一样的。其pn = (page - 1) * 50

url = "https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn="

pn = (page - 1) * 50

full_url = url + str(pn)

"""

# 导入库

import urllib

import urllib.request

# 根据url地址,获取服务器响应文件

def loadPage(url):

"""

功能:根据url地址,获取服务器响应文件

:param url: url地址

:return: 获取的服务器响应文件信息

"""

# chrome 的User-Agent 头

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}

# url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent

request = urllib.request.Request(url, headers = header)

# 向服务器发送这个请求

reponse = urllib.request.urlopen(request)

# 获取响应文件中的全部内容

html = reponse.read()

return html

# 存储文件

def writeFile(html, file_name):

"""

功能:存服务器响应文件到本地磁盘文件里

:param html: 服务器响应文件内容

:param file_name: 本地磁盘文件名

:return: None

"""

with open(file_name, "wb") as f:

f.write(html)

# 贴吧爬虫函数

def tiebaSpider(url, begin_page, end_page):

"""

功能:处理从begin_page到end_page的url页面

:param url: url地址

:param begin_page: 需爬取的起始页

:param end_page: 需爬取的终止页

:return:

"""

for page in range(begin_page, end_page + 1):

pn = (page - 1) * 50

full_url = url + str(pn)

file_name = "第" + str(page) + "页.html"

print("正在爬取" + file_name)

# 获取full_url对应的html文件信息

html = loadPage(full_url)

print("正在存储" + file_name)

# 存储full_url对应的html文件信息

writeFile(html, file_name)

# 主函数

if __name__ == '__main__':

url = "https://tieba.baidu.com/f?"

# 输入需爬取的贴吧

kw = input("请输入需要爬取的贴吧:")

# 输入需爬取的起始页和终止页

begin_page = int(input("请输入起始页:"))

end_page = int(input("请输入终止页:"))

key = urllib.parse.urlencode({"kw":kw})

# 组合的的url示例:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=

url = url + key + "&ie=utf-8&pn="

# 调用贴吧爬虫函数,爬取数据

tiebaSpider(url, begin_page, end_page)

POST方式

Request请求对象里有data参数,这就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要有匹配键值对。

以下以有道词典翻译网站为例为模拟POST请求。

#!/usr/bin/python3

# -*- coding:utf-8 -*-

"""

POST方式:以有道词典翻译网站为例

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

"""

# 导入库

import urllib.request

import urllib

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

# chrome 的 User-Agent,包含在 header里

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}

word = input("请输入需要翻译的词条:")

from_data = {

"i":word,

"from":"AUTO",

"to":"AUTO",

"smartresult":"dict",

"doctype":"json",

"version":"2.1",

"keyfrom":"fanyi.wed"

}

data = urllib.parse.urlencode(from_data)

data = data.encode(encoding="utf-8") # str转bytes

request = urllib.request.Request(url, data = data, headers = header)

response = urllib.request.urlopen(request)

html = response.read().decode(encoding = "utf-8").strip()

print(html)

获取AJAX加载的内容

有些网页内容是使用AJAX加载的,AJAX一般返回的是JSON,直接对AJAX地址进行POST或GET,就能返回JSON数据。

#!/usr/bin/python3

# -*- coding:utf-8 -*-

"""

获取AJAX加载的数据

有些网页内容使用AJAX加载,只要记得,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了。

以豆瓣为例:

url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100:90&action&start=0&limit=100"

"""

# 导入库

import urllib

import urllib.request

url = "https://movie.douban.com/j/chart/top_list?"

# chrome 的 User-Agent,包含在 header里

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}

from_data = {

'type':'11',

'interval_id':'100:90',

'action':'',

'start':'0',

'limit':'100'

}

data = urllib.parse.urlencode(from_data)

data = data.encode(encoding="utf-8") # str转bytes

request = urllib.request.Request(url, data = data, headers = header)

response = urllib.request.urlopen(request)

html = response.read().decode(encoding = "utf-8")

print(html)

都明白了吗?最后注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!

本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。



推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
张小虎要努力
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有