爬虫——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=爬虫'
一般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 -*-
__author__ = 'mayi' # 导入库
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
……
爬取以上页面的内容
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi' """
功能:批量爬取贴吧页面数据
目标地址:百度贴吧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 -*-
__author__ = 'mayi' """
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 -*-
__author__ = 'mayi' """
获取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)
爬虫——GET请求和POST请求的更多相关文章
- Ajax中get请求和post请求
我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...
- slave IO流程之二:注册slave请求和dump请求
slave IO流程已经在http://www.cnblogs.com/onlyac/p/5815566.html中有介绍 这次我们要探索注册slave请求和dump请求的报文格式和主要流程. 一.注 ...
- loadrunner录制脚本如何选择使用get请求和post请求的方式
在loadrunner工具里录制脚本时常常会用到get请求和post请求,有关loadrunner常用的这两类的请求主要有: get请求: web_url 和 web_link post请求: web ...
- iOS开发网络篇—GET请求和POST请求
iOS开发网络篇—GET请求和POST请求 一.GET请求和POST请求简单说明 创建GET请求 // 1.设置请求路径 NSString *urlStr=[NSString stringWithFo ...
- 普通请求和ajax请求的区别
普通请求和ajax请求的区别? 下面的action返回一个json文件,文件内容为sts.*,data1
- iOS开发网络篇—GET请求和POST请求(转)
一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http:/ ...
- GET请求和POST请求的区别
request获取请求参数 最为常见的客户端传递参数方式有两种: 浏览器地址栏直接输入:一定是GET请求: 超链接:一定是GET请求: 表单:可以是GET,也可以是POST,这取决与<form& ...
- 使用SoapUI工具做get请求和post请求接口测试
祝大家节日快乐啦. 之前写过的一篇帖子已经介绍了SoapUI工具的基本使用,所以在此不再重复讲解关于建工程.建测试套件.添加用例等操作,可查看该篇文章详解:http://www.cnblogs.com ...
- Ajax相关——get请求和post请求的区别
一.完整的URL由以下几部分组成: scheme:通信协议,常用的有:http/ftp. host:主机,服务器(计算机)域名或IP地址 port:端口,整数,可选,省略时使用默认端口,http的默认 ...
随机推荐
- scss-字符串连接符
+ 运算可用于连接字符串: // SCSS p { cursor: e + -resize; } // 编译后的 CSS 样式 p { cursor: e-resize; } 请注意,如果带引号的字符 ...
- Entity Framework:“无法加载指定的元数据资源
System.Data.Entity.Core.MetadataException:“无法加载指定的元数据资源 CodeFirst方式使用EF,写入数据时报错.System.Data.Entity.C ...
- c++链表实现学生成绩管理系统(简易版)
#include<iostream> using namespace std; typedef struct student{ int id;//学号 string sex; string ...
- Linux --Mysql基础命令
mysql>create database a; --创建一个名为a的新库 mysql>create table a: --创建一个名为a新表 mysql>use a: --进入一个 ...
- 二、Python安装扩展库
第一步:推荐easy_install工具 下载地址:https://pypi.python.org/pypi/setuptools 下载"ez_setup.py"文件; 通过运行c ...
- 【转】vector中对象指针的排序
原文:http://blog.csdn.net/tanlijun37/article/details/1948493 vector中对象指针的排序,初步想法是1: 把对象指针存到vector,重载bo ...
- Xpath定位_1:子找父以及contains的用法
先上xml代码,如下图,在写自动化脚本时,需要定位到数字为10334的td元素.td元素的父元素.父的父元素以及属性值都一样:只有同胞元素的元素值不同.以此可以通过先定位到同胞元素,在找到父元素下的期 ...
- IT人们给个建议
开篇声明:我本身是中学老师,师范类大学计算机专业毕业,现在马上研究生学位就要拿上了,平时在学校搞网络维护什么的,事少,业余时间充足,也不想拘泥于做老师拿点工资,觉得白学计算机了,所以也搞些业余开发,如 ...
- Android 高级UI设计笔记09:Android实现无限滚动列表
1. 无限滚动列表应用场景: ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们 ...
- [19/03/15-星期五] 常用类_String类&StringBuilder和StringBuffer类
一.基本概念 String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”. 那什么叫做“不可变对象”呢? 指的是对象内部的成员变量的值无法再改变.Str ...