#! /usr/bin/env python3

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

#urllib提供了一系列用于操作URL的功能。

#urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:

#例如,对豆瓣的一个URL : https://api.douban.com/v2/book/2129650 进行抓取,并返回响应:

from urllib import request

with request.urlopen('https://api.douban.com/v2/book/2129650') as f :

data=f.read()

print('Status:',f.status,f.reason)

for k,v in f.getheaders():

print('%s:%s' % (k,v))

print('Data:',data.decode('utf-8'))

'''

Status: 200 OK

Date:Wed, 10 May 2017 07:15:35 GMT

Content-Type:application/json; charset=utf-8

Content-Length:2055

Connection:close

Vary:Accept-Encoding

X-Ratelimit-Remaining2:99

X-Ratelimit-Limit2:100

Expires:Sun, 1 Jan 2006 01:00:00 GMT

Pragma:no-cache

Cache-Control:must-revalidate, no-cache, private

Set-Cookie:bid=tJuu061vOU0; Expires=Thu, 10-May-18 07:15:35 GMT; Domain=.douban.com; Path=/

X-DOUBAN-NEWBID:tJuu061vOU0

X-DAE-Node:sindar7d

X-DAE-App:book

Server:dae

Data: {"rating":{"max":10,"numRaters":16,"average":"7.4","min":0},"subtitle":"","author":["廖雪峰编著"],"pubdate":"2007-6","tags":[{"count":21,"name":"spring","title":"spring"},{"count":13,"name":"Java","title":"Java"},{"count":6,"name":"javaee","title":"javaee"},{"count":5,"name":"j2ee","title":"j2ee"},{"count":4,"name":"计算机","title":"计算机"},{"count":3,"name":"POJO","title":"POJO"},{"count":3,"name":"藏书","title":"藏书"},{"count":3,"name":"编程","title":"编程"}],"origin_title":"","image":"https://img3.doubanio.com\/mpic\/s2648230.jpg","binding":"","translator":[],"catalog":"","pages":"509","images":{"small":"https://img3.doubanio.com\/spic\/s2648230.jpg","large":"https://img3.doubanio.com\/lpic\/s2648230.jpg","medium":"https://img3.doubanio.com\/mpic\/s2648230.jpg"},"alt":"https:\/\/book.douban.com\/subject\/2129650\/","id":"2129650","publisher":"电子工业","isbn10":"7121042622","isbn13":"9787121042621","title":"Spring 2.0核心技术与最佳实践","url":"https:\/\/api.douban.com\/v2\/book\/2129650","alt_title":"","author_intro":"","summary":"本书注重实践而又深入理论,由浅入深且详细介绍了Spring 2.0框架的几乎全部的内容,并重点突出2.0版本的新特性。本书将为读者展示如何应用Spring 2.0框 架创建灵活高效的JavaEE应用,并提供了一个真正可直接部署的完整的Web应用程序——Live在线书店(http:\/\/www.livebookstore.net)。\n在介绍Spring框架的同时,本书还介绍了与Spring相关的大量第三方框架,涉及领域全面,实用性强。本书另一大特色是实用性强 ,易于上手,以实际项目为出发点,介绍项目开发中应遵循的最佳开发模式。\n本书还介绍了大量实践性极强的例子,并给出了完整的配置步骤,几乎覆盖了Spring 2.0版本的新特性。\n本书适合有一定Java基础的读者,对JavaEE开发人员特别有帮助。本书既可以作为Spring 2.0的学习指南,也可以作为实际项目开发的参考手册。","price":"59.80元"}

'''

#可以看到HTTP响应的头和JSON数据

#如果我们想要模拟浏览器发送get请求,就需要使用request对象,通过往request对象添加HTTP头,就可以把请求伪装成浏览器。

#例,模拟iPhone 6 去请求豆瓣首页:

from urllib import request

req=request.Request('http://www.douban.com/')

req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')

with request.urlopen(req) as f :

print('Status:',f.status,f.reason)

for k,v in f.getheaders():

print('%s:%s' % (k,v))

print('Data:',f.read().decode('utf-8'))

#这样豆瓣会返回合适iPhone的移动版网页:

'''

...

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">

<meta name="format-detection" content="telephone=no">

<link rel="apple-touch-icon" sizes="57x57" href="http://img4.douban.com/pics/cardkit/launcher/57.png" />

...

'''

#Post

#如果要以POST发送一个请求,只需要把参数data以bytes形式传入。

#我们模拟一个微博登录,先读取登录的邮箱和口令,然后按照weibo.cn 的登录页的格式以username=xxx&password=xxx 的编码传入:

from urllib import request,parse

print('Login to weibo.cn...')

email=input('Email:')

passwd=input('Password:')

login_data=parse.urlencode([

('username',email),

('password',passwd),

('entry','mweibo'),

('client_id','l'),

('ec',''),

('pagerefer','https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')

])

req=request.Request('https://passport.weibo.cn/sso/login')

req.add_header('Origin','https://passport.weibo.cn')

req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')

req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')

with request.urlopen(req,data=login_data.encode('utf-8')) as f:

print('Status:',f.status,f.reason)

for k,v in f.getheaders():

print('%s:%s' % (k,v))

print('Data:',f.read().decode('utf-8'))

#如果登录成功,我们获得的响应如下:

'''

Status: 200 OK

Server: nginx/1.2.0

...

Set-Cookie: SSOLoginState=1432620126; path=/; domain=weibo.cn

...

Data: {"retcode":20000000,"msg":"","data":{...,"uid":"1658384301"}}

'''

#如果登录失败,我们获得的响应如下:

#...

#Data: {"retcode":50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"example@python.org","errline":536}}

#Handler

#如果还需要更复杂的控制,比如通过一个Proxy去访问网站,我们需要利用ProxyHandler来处理,例:

proxy_handler=urllib.request.ProxyHandler({'http':'http://www.example.com:3128/'})

proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()

proxy_auth_handler.add_password('realm','host','username','password')

opener=urllib.request.build_opener(proxy_handler,proxy_auth_handler)

with opener.open('http://www.example.com/login.html') as f

pass

#urllib提供的功能就是利用程序去执行各种Http请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据

#浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的。

urllib 获取页面或发送信息的更多相关文章

  1. javascript 常用获取页面宽高信息 API

    在页面的构建中 常常会需要获取页面的一些宽高信息,例如实现 惰性加载图片 需要获取页面的可见区域高度 和 已滚动区域的高度,以判断图片所在位置是否可见来决定加载图片的时间, 花点时间整理了一下,获取页 ...

  2. 示例 - 10行代码在C#中获取页面元素布局信息

    最近研究一个如何在网页定位验证码并截图的问题时, 用SS写了一段C#小脚本可以轻松获取页面任意元素的布局信息 (top, left, width, height). 10行功能代码, 觉得有点用, 现 ...

  3. scrapy获取页面信息

    本例子用命令行调试的方式,演示如何获取页面的特定信息: 0) 示例页面 1) 使用scrapy shell获取目标页面: scrapy shell http://bj.lianjia.com/ersh ...

  4. 关于页面刷新或者调用方法事获取不到元素信息或者出现缺少对象错误的换位思考setTimeout的使用

    这两天客户的需求不能定下来,做闲人好长时间了,不如来整理下最近碰到的一些个小麻烦. 正题: 场景一. 最近在开发的过程中使用到了百度的富客户端文本编辑器(ueditor)---这是一款功能很强大的文本 ...

  5. js获取当前页面url网址信息

    js如何准确获取当前页面url网址信息 在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个 ...

  6. java,利用Selenium调用浏览器,动态模拟浏览器事件,动态获取页面信息

    1.环境搭建 jdk1.6版本:selenium 2.4版本. jdk1.8版本:selenium3.14版本. (1)selenium的jar包下载: 地址:http://selenium-rele ...

  7. js准确获取当前页面url网址信息

    这篇文章主要为大家介绍了js准确获取当前页面url网址信息的多种方法,包括正则法.split拆分法等,需要的朋友可以参考下   在WEB开发中,时常会用到javascript来获取当前页面的url网址 ...

  8. Python+Selenium自动化-获取页面信息

    Python+Selenium自动化-获取页面信息   1.获取页面title title:获取当前页面的标题显示的字段 from selenium import webdriver import t ...

  9. Python+Selenium 自动化实现实例-获取页面元素信息(百度首页)

    #coding=utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.ba ...

随机推荐

  1. Getting started with Processing 第十三章——延伸(2)

    与 Arduino 联动 在 Processing 中,可以通过:import processing.serial.* Serial port; //声明串口对象port = new Serial(t ...

  2. boke练习: springboot整合springSecurity出现的问题,post,delete,put无法使用

    springboot 与 SpringSecurity整合后,为了防御csrf攻击,只有GET|OPTIONS|HEAD|TRACE|CONNECTION可以通过. 其他方法请求时,需要有token ...

  3. spring security+freemarker获取登陆用户的信息

    spring security+freemarker获取登陆用户的信息 目标页面之间获取 ${Session.SPRING_SECURITY_CONTEXT.authentication.princi ...

  4. java ----> 手动编译java项目

    环境: jdk1.8,cmd,notepad++ 创建java工程test,创建文件夹: src classes lib 说明: src 放置.java文件 classes 放置.class文件 li ...

  5. English trip EM2-PE-6A Family Relationship Teacher:Taylor

    课上内容(Lesson) What's your name? Where is your hometown?  你的家乡是哪里? Where do you come from?    你从哪里来?  ...

  6. android ------- 运行官方NDK 案例HelloJNI

    下载案例 HelloJNI ,导入工程到Eclipse,  可以直接下载我的案例, 源码下载:https://github.com/DickyQie/android-ndk 目录图 使用命令生成  . ...

  7. Spring Batch Bean 校验 API 支持

    这个发布版本带来了一个新的  ValidatingItemProcessor 实现,这个实现被称为 BeanValidatingItemProcessor.能够让你使用 Bean Validation ...

  8. 三种css样式表及其优先级

    1.行内样式 body内: <p style="text-indent: 2em;color: red"> 我是行内样式 </p> 2.内部样式表 body ...

  9. http认证方式,工程部分实现

    学习过程中,被boss批评,要求去复习http协议,因此找了相关资料做成一个系列:对于http认证方式不清楚的可以参考我的上一篇文章 http认证方式https://www.cnblogs.com/j ...

  10. 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15)C - Cactus Jubilee

    题意:给一颗仙人掌,要求移动一条边,不能放在原处,移动之后还是一颗仙人掌的方案数(仙人掌:无向图,每条边只在一个环中),等价于先删除一条边,然后加一条边 题解:对于一颗仙人掌,分成两种边,1:环边:环 ...