Python2的GET请求
# urllib 仅可以接受URL,不能创建 设置了headers 的Request 类实例。
# urllib 提供 urlencode 方法用来GET查询字符串的产生,而 urllib2 则没有。(这是 urllib 和 urllib2 经常一起使用的主要原因)。
# 编码工作使用urllib的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串。
# 解码工作使用urllib的unquote()函数。(注意,不是urllib2.urlencode())。
# 一般HTTP请求提交数据,需要编码成 URL编码格式。然后作为url的一部分,或者作为参数传到Request对象中。
import urllib
word = {"wd": "传智播客"}
# 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。接收的参数是一个字典。
word = urllib.urlencode(word)
print word # 结果:"wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"
# 通过urllib.unquote()方法,把 URL编码字符串,转换回原先字符串。
word = urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2")
print word # 结果:wd=传智播客
import urllib #负责url编码处理
import urllib2
url = "http://www.baidu.com/s"
word = {"wd": "传智播客"}
word = urllib.urlencode(word) # 转换成url编码格式(字符串)
newurl = url + "?" + word # url首个分隔符就是 ?
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
request = urllib2.Request(newurl, data=None, headers=headers) # get请求可以不带参数data。
request.add_header("Authorization", "APPCODE " + "d108a3c6fb764d038abc48710fc55ffc")
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
request.get_header("Authorization")
request.get_header("Content-type")
response = urllib2.urlopen(request)
print response.read()
import urllib
import urllib2
def tiebaSpider(url, beginPage, endPage):
for page in range(beginPage, endPage + 1):
pn = (page - 1) * 50
filename = "第" + str(page) + "页.html"
# 组合为完整的 url,并且pn值每次增加50
fullurl = url + "&pn=" + str(pn)
# 调用loadPage()发送请求,获取HTML页面(服务器响应文件)
html = loadPage(fullurl, filename)
# 将获取到的HTML页面(服务器响应文件)写入本地磁盘文件
writeFile(html, filename)
def loadPage(url, filename):
print "正在下载" + filename
headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
# python3 爬取网页的写法如下:
# request = urllib.request.Request(url, headers=headers)
# response = urllib.request.urlopen(request)
return response.read()
def writeFile(html, filename):
print "正在存储" + filename
with open(filename, 'wb') as f:
f.write(html)
if __name__ == "__main__":
kw = raw_input("请输入需要爬取的贴吧:")
# 输入起始页和终止页,str转成int类型
beginPage = int(raw_input("请输入起始页:"))
endPage = int(raw_input("请输入终止页:"))
url = "http://tieba.baidu.com/f?"
key = urllib.urlencode({"kw": kw})
# 组合后的url示例:http://tieba.baidu.com/f?kw=lol
url = url + key
tiebaSpider(url, beginPage, endPage)
Python2的POST请求
import urllib
import urllib2
newurl = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
headers = {"User-Agent": "Mozilla...."}
formdata = {
"i": "i love python",
"doctype": "json",
"keyfrom": "fanyi.web",
}
data = urllib.urlencode(formdata)
request = urllib2.Request(newurl, data=data, headers=headers) # post请求一定要带参数data。
request.add_header("Authorization", "APPCODE " + "d108a3c6fb764d038abc48710fc55ffc")
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
request.get_header("Authorization")
request.get_header("Content-type")
response = urllib2.urlopen(request)
print response.read()
# 上面我们说了Request请求对象里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。
# 发送POST请求时,需要特别注意headers的一些属性:
# Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。
# X-Requested-With: XMLHttpRequest :表示Ajax异步请求。
# Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。
获取AJAX加载的内容
# -*- coding:utf-8 -*-
import urllib
import urllib2
url = "https://movie.douban.com/j/chart/top_list?"
# 处理所有参数
formdata = {
'type':'11',
'interval_id':'100:90',
'action':'',
'start': '0',
'limit': '10'
}
url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"
# 变动的是这两个参数,从start开始往后显示limit个
formdata = {
'start': '0',
'limit': '10'
}
headers = {"User-Agent": "Mozilla...."}
data = urllib.urlencode(formdata)
request = urllib2.Request(url, data=data, headers=headers)
response = urllib2.urlopen(request)
print response.read()