python爬虫(五)_urllib2的Get请求和Post请求

一个星期又过去了,时间过得还真是快,逐渐发轫真的融入到高校的活着中,这些星期相比乐意的事是,看完了一本书(挺厚的)。不过脑子中印象不是很深入(果然又要读五遍)。焊工大赛弄得有点累(队友们都扬弃了,然后剩下作者单独把创作形成)。周三的院运会也玩的不易。最痛心的依旧lol
s7半决赛,在rng这么努力,非凡丰富接近亚军的境况下,被李哥捏碎了黑狗的亚军梦,心痛小狗。诶,最喜爱的we,被ssg虐杀了。然而技不如人,没提到,你们已经显现的很好了,从入围塞到四强,很厉害了,固然输掉了竞赛很痛楚,但假如队魂在,你们永远是we。keep 
your 
dream,二零一八年再战。纵然有些玩这几个游戏了,但依旧会接济你们的。那么些星期的情愫基调就是随着那一个比赛的音调,跌宕起伏。技术部和we挺像的,都以一群有愿意的年轻人(?)在卖力的斗争。加油。

urllib.urlencode()

urllib和urllib2都是承受URL请求的有关参数,不过提供了差别的效能。七个最显著的不等如下:

  • urllib仅能够承受URL,无法创立设置了headers的Request类实例;
  • 但是urllib提供了urlencode方法用来GET查询字符串的发生,而urllib2则从未。(那是urllib和urllib2平日一同行使的首要性原因)
  • 编码工作选择urllib的urlencode()函数,帮大家将key:value这么的键值对转换成"key=value"如此那般的字符串,解码工作得以利用urllib的unquote()函数。(注意,不是urllib.urlencode())
#-*- coding:utf-8 -*-
#06.urllib2_urlencode.py
import urllib2
import urllib

word = {"wd":"传智播客"}

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

print(encode)
#通过urllib.unquote()方法,把URL编码字符串,转换回原始字符串

print(urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"))

相似HTTP请求提交数据,需求编码成URL编码格式,然后作为url的一局地,可能作为参数传到Request对象中。

本篇将介绍urllib2的Get和Post方法,愈来愈多内容请参见:python学习指南

拿到AJAX加载的内容

稍加网页内容使用AJAX加载,只要记得,AJAX一般重临的是JSON,直接对AJAX地址进行post或get,就回到JSON数据了。
“作为一名爬虫工程师,你最亟需关爱的,是多少的来自了。”

#-*- coding:utf-8 -*-
#10.urllib2_ajax.py
import urllib
import urllib2

# demo1

url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"

headers={"User-Agent": "Mozilla...."}

# 变动的是这两个参数,从start开始往后显示limit个
formdata = {
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print(response.read())


#demo2
url = "https://movie.douban.com/j/chart/top_list?"
headers={"User-Agent": "Mozilla...."}

# 处理所有参数
formdata = {
    'type':'11',
    'interval_id':'100:90',
    'action':'',
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()

批量爬取贴吧页面数据

率先大家创设一个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=0

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

第二页:[http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100\](http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

察觉规律了吗,贴吧中各个页面不相同之处,就是url最后的pn的值,其他的都以同等的,大家得以抓住那一个原理。

不难写一个小爬虫程序,来爬虫百度LOL吧的兼具网页

  • 先写一个main,提醒用户输入要爬取的贴吧名,并用urllib.urlencode()举办转码,然后组合url,假如是lol吧,那么结合的url就是:
    http://tieba.baidu.com/f?kw=lol

# 模拟 main 函数
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)
  • 接下去,大家写一个百度贴吧爬虫接口,大家须求传递3个参数给那一个接口,一个是main里组合url地址,以及伊始页和平息页码
    ,表示要爬取页码的限制。

def tiebaSpider(url, beginPage, endPage):
    """
        作用:负责处理url,分配每个url去发送请求
        url:需要处理的第一个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)
        #print fullurl

        # 调用loadPage()发送请求获取HTML页面
        html = loadPage(fullurl, filename)
        # 将获取到的HTML页面写入本地磁盘文件
        writeFile(html, filename)
  • 咱俩已经从前写出一个爬取一个网页的代码。未来,大家得以把它封装成一个loadPage,供大家使用。

def loadPage(url, filename):
    '''
        作用:根据url发送请求,获取服务器响应文件
        url:需要爬取的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)
    return response.read()
  • 最终只要大家愿意将爬取到了每页的信息囤积在位置磁盘上,大家得以不难写一个储存文件的接口。

def writeFile(html, filename):
    """
        作用:保存服务器响应文件到本地磁盘文件里
        html: 服务器响应文件
        filename: 本地磁盘文件名
    """
    print "正在存储" + filename
    with open(filename, 'w') as f:
        f.write(html)
    print "-" * 20

实际过多网站皆以那样的,同类网站下的html页面编号,分别对应网址后的网页序号,只要发觉规律就可以批量爬取页面了。

拍卖HTTPS请求SSL证书验证

今昔四处可知https开端的网站,urllib2可以为HTTPS请求验证SSL证书,就好像web浏览器同样,假设网站的SSL证书是透过CA认证的,则可以正常访问,如https://www.baidu.com/
一经SSL证书验证不通过,大概操作系统不信任服务器的平安申明,比如浏览器在访问12306网站如:”https://www.12306.cn/normhweb/“的时候,会警告用户证书不受信任。(传说12306互连网证书是和谐的,没有经过CA认证)

图片 1

12306

urllib2在走访的时候则会报出SSLError:

import urllib2

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

response = urllib2.urlopen(request)

print(response.read())

运作结果:
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
就此,即使之后碰到那种网站,大家必要独自处理SSL证书,让程序忽略SSL证书验证错误,即可正常访问。

import urllib
import urllib2
# 1. 导入Python SSL处理模块
import ssl

# 2. 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

# 3. 在urlopen()方法里 指明添加 context 参数
response = urllib2.urlopen(request, context = context)

print response.read()

POST方式:

地点大家说了Request请求对象里有data参数,它就是用在POST里,大家要传送的数额就是那一个参数data,data是一个字典,里面要匹配键值对。

题材:为啥有时候POST也能在URL内看看数据?

  • GET格局是以直接以链接格局拜访,链接中包括了拥有参数,服务器端用Request.QueryString获取变量的值。若是含有了密码的话是一种不安全的接纳,然而你可以直观地看到本人提交了何等内容。
  • POST则不会在网址上显得所有的参数,服务器端用Request.Form获取提交的数目,在Form提交的时候。然而HTML代码里假使不指定method属性,则暗中同意为GET请求,Form中提交的数额将会叠加在url之后,以?与url分开
  • 表单数据足以当作URL字段(method=”get”)只怕HTTP
    POST(method=”post”)的法子来发送。比如在底下的HTML代码中,表单数据将因为(method=”get”)而增大到URL上;
<form action="form_action.asp" method="get">
    <p>First name: <input type="text" name="fname" /></p>
    <p>Last name: <input type="text" name="lname" /></p>
    <input type="submit" value="Submit" />
</form>

图片 2

豆瓣ajax

urllib2暗许只扶助HTTP/HTTPS的GET和POST方法

关于CA

CA(Certificate
Authority)是数字证书认证中央的简称,是指发放、管理、取消数字证书的受倚重的第三方单位,如日本东京数字认证股份有限公司、巴黎市数字证书认证大旨有限集团等…

CA的功效是反省讲明持有者身份的合法性,并签发证书,防止证书被假冒或歪曲,以及对表明和密钥举行管制。

现实生活中可以用身份证来表明身份,
那么在网络世界里,数字证书就是身份证。和现实生活差别的是,并不是每一种上网的用户都有数字证书的,往往唯有当一个人须求表明自身的身份的时候才须求用到数字证书。

普通用户一般是不需求,因为网站并不关怀是什么人访问了网站,今后的网站只关切流量。可是反过来,网站就要求表达自身的身份了。

比如说今后钓鱼网站很多的,比如您想拜会的是www.baidu.com,但实质上您拜访的是www.daibu.com”,所以在提交自身的难言之隐音讯从前需求证实一下网站的身价,须求网站彰显数字证书。

貌似正常的网站都会主动出示本人的数字证书,来确保客户端和网站服务器之间的通讯数据是加密安全的。

Get方式

Get请求一般用来大家向服务器获取数据,比如说,大家用百度查寻传智播客https://www.baidu.com/s?wd=传智播客

浏览器的url会跳转如图所示

图片 3

百度传智搜索

https://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

在中间大家得以看出在伏乞部分里,http://www.baidu.com/s尔后出现一个长长的字符串,其中就富含小编门要询问的首要性词传智播客,于是大家可以尝试利用暗中认同的Get方式来发送请求。

#-*- coding:utf-8 -*-
#07.urllib2_get.py

import urllib
import urllib2

url = "http://www.baidu.com/s"
word = {"wd":"传智播客"}
word = urllib.urlencode(word) #转换成url编码格式(字符串)

newurl = url + "?" + word

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,headers = headers)

response = urllib2.urlopen(request)

print(response.read())

参考

  1. 破解有道翻译反爬虫机制
  2. 浏览器验证网站数字证书的流程

有道词典翻译网站:

输入测试数据,再通过使用Fiddler观望,其中有一条是POST请求,而向服务器发送的伏乞数据并不是在url里,那么我们可以试着模拟这么些POST请求。

图片 4

有道翻译

于是,我们可以尝试用POST情势发送请求。

#-*- coding:utf-8 -*-
#09.urllib2_post.py

import urllib
import urllib2

#POST请求的目标URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers = {"User-Agent":"Mozilla...."}

formate = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyform":"fanyi.web",
    "ue":"utf-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

data = urllib.urlencode(formate)

request = urllib2.Request(url, data=data, headers = headers)

response = urllib2.urlopen(request)

print("-"*30)
print(response.read())

发送POST请求时,要求尤其注意headers的有些属性:

Content-Length:是指发送的表单数据长度为144,约等于字符个数是144个;
X-Requested-With:表示Ajax异步请求。
Content-Type: application/x-www-form-urlencoded:表示浏览器提交web表单时,表单数据会根据name1=value1&name2=value2键值对格局开展编码。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website