Python之路:爬虫之urllib库的基本使用和高级使用
关于爬虫自己一直在看,所以时间太慢,这才第二更,有等不及的小伙伴可以慢慢的品尝了,在看下面的之前,建议先把上一章看一下。以下是关于python的Urllib的基础和高级用法。
1、如何扒下一个网站,用最短的时间
每一个网站都是根据url获取页面信息,页面信息就是通过一段html代码,加js、css。html是骨架,js是肌肉,css是衣服,一下写一个简单的实例:
- wolf@ubuntu-python:~/python$ sudo vi demo.py
- #!/usr/bin/python
- #coding:utf-8
- import urllib2 #导入urllib2库
- response = urllib2.urlopen("http://www.baidu.com") #获取百度url
- print response.read() #读取url函数
这就是一个简单的爬虫,保存运行一下看看都爬取了什么。
- wolf@ubuntu-python:~/python$ python demo.py
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
- <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
- <META HTTP-EQUIV="Expires" CONTENT="">
- <title>百度一下,你就知道</title>
- </head>
- <body>
- <script>
- (function(d){
- function isCkie(){
- var isSupport=false;
- if(typeof(navigator.cookieEnabled)!='undefined'){
- isSupport=navigator.cookieEnabled;
- }
- return isSupport;
- }
- //Cookie相关函数
- var sCkie=new function(){
- //过期时间
- this.expTime=function(millisecond){if(millisecond.length==){millisecond=};var exp=new Date();exp.setTime(exp.getTime()+parseInt(millisecond));return exp.toGMTString();};
- //创建cookie
- this.add=function(name,value,expires,path,domain,secure){d.cookie=name+"="+encodeURI(value)+(expires?(';expires='+expires):'')+(path?(';path='+path):'')+(domain?(';domain='+domain):'')+((secure)?';secure':'');};
- //删除cookie
- //this.del=function(name,path,domain){if(getCookie(name)){document.cookie=name+"="+((path)?(";path="+path):'')+((domain)?(";domain="+domain):'')+";expires=Mon,01-Jan-2006 00:00:01 GMT";}};
- //获取cookie
- this.get=function(name){var arg=name+"=";var alen=arg.length;var theCookie=''+d.cookie;var inCookieSite=theCookie.indexOf(arg);if(inCookieSite==-||name==""){return '';}var begin=inCookieSite+alen;var end=theCookie.indexOf(';',begin);if(end==-){end=theCookie.length;}return decodeURI(theCookie.substring(begin,end));};
- };
- var gUrl;
- if(isCkie()){
- var ckie=;
- var sid='lpvt_f6461a705844d7177814f8a1aa45aaa5';
- var skie=sCkie.get(sid);
- if (skie!='')
- {
- ckie=parseInt(skie);
- }
- if(ckie<){
- var rand=Math.random();
- if(rand<1.8){
- gUrl="https://www.baidu.com/index.php?tn=01025065_7_pg";
- }else{
- gUrl="https://www.baidu.com/";
- }
- sCkie.add(sid,'',sCkie.expTime(**),,,);
- }else{
- gUrl="https://www.baidu.com/";
- }
- }else{
- gUrl="https://www.baidu.com/";
- }
- (function(u){if(window.navigate&&typeof navigate=='function')navigate(u);var ua=navigator.userAgent;if(ua.match(/applewebkit/i)){var h = document.createElement('a');h.rel='noreferrer';h.href=u;document.body.appendChild(h);var evt=document.createEvent('MouseEvents');evt.initEvent('click', true,true);h.dispatchEvent(evt);}else{document.write('<meta http-equiv="Refresh" Content="0; Url='+u+'" >');}})(gUrl);
- })(document);
- </script>
- </body>
- </html>
- wolf@ubuntu-python:~/python$
demo
没错,你没看错,这个就是简单的百度页面源码,是不是很简单。
2、解析上例
先看第一行导入库
- import urllib2 #导入urllib2库
urllib2是python的一个获取urls的组件它以urlopen函数的形式提供了一个非常简单的接口,也会根据urls的协议获取能力,提供比较复杂的接口,例如:基础验证、cookies、代理和其它。更多详情。
第二行代码获取url
- response = urllib2.urlopen("http://www.baidu.com") #获取百度url
调用了urllib2库里的urlopen方法,传入一个url,协议是http协议,也可以换做ftp、file、https等等,只是代表了一种控制协议,urlopen一般接受三个参数,参数如下:
- urlopen(url, data, timeout)
第一个参数是url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是超时时间。
后边的两个参数data、timeout是可以不传送的,data默认是空的,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT所以第一个参数是必须要传送的,上面的例子里传送里百度的url,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里。
- print response.read() #读取url函数
response对象有一个read方法,可以获取页面的内容。
如果不加read直接打印会是什么?答案如下:
- wolf@ubuntu-python:~/python$ python demo.py
- <addinfourl at 139701058454736 whose fp = <socket._fileobject object at 0x7f0eb1e7b7d0>>
直接打印出的是对象的描述,所以一顶要加read方法,否则打印的就不是网页的内容了。
3、构造Requset
其实上面的urlopen参数可以传入一个request请求,它其实就是一个Requset类的实例,构造时需要传入url、Data等等等内容。所以上面的代码也可以这样写。
- wolf@ubuntu-python:~/python$ sudo vi demo.py
- #!/usr/bin/python
- #coding:utf-8
- import urllib2
- request = urllib2.Request("http://www.baidu.com") #构建一个request对象
- response = urllib2.urlopen(request) #请求request对象的url
- print response.read() #读取request对象的url的函数
两者的运行结果是一样的,只是中间多了一个request对象,因为在构建请求时还需要加入好多内容,所以推荐大家这样写。通过构建一个request,服务器响应请求得到应答,这样显得逻辑清晰明确。
4、POST和GET数据传送
上面是最基本的网页抓取,不多对于大多数的动态网页,需要动态的传递参数给它,它做出对应的响应。所以,在访问时,需要传递数据给它。最常见的就是注册登录。
把数据用户名和密码传送到一个url,服务器得到处理之后到响应,后面如何处理,请继续往下看。
数据的传输分为POST和GET两个方式,至于两个方式的区别呢?下面为您揭晓。
最重要的是GET的方式是直接以链接的形式访问,链接
- wolf@ubuntu-python:~/python$ sudo vi demo.py
- #!/usr/bin/python
- #coding:utf-
- import urllib2 #导入urllib2库
- response = urllib2.urlopen("http://www.baidu.com") #获取百度url
- print response.read() #读取url函数
Python之路:爬虫之urllib库的基本使用和高级使用的更多相关文章
- python爬虫之urllib库(三)
python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...
- python爬虫之urllib库(二)
python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...
- python爬虫之urllib库(一)
python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...
- python爬虫03 Urllib库
Urllib 这可是 python 内置的库 在 Python 这个内置的 Urllib 库中 有这么 4 个模块 request request模块是我们用的比较多的 就是用它来发起请求 所以我 ...
- python 3.x 爬虫基础---Urllib详解
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...
- Python爬虫学习:Python内置的爬虫模块urllib库
urllib库 urllib库是Python中一个最基本的网络请求的库.它可以模拟浏览器的行为发送请求(都是这样),从而获取返回的数据 urllib.request 在Python3的urllib库当 ...
- python爬虫之urllib库介绍
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- python 爬虫之 urllib库
文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...
- Python 爬虫之urllib库的使用
urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urlli ...
随机推荐
- C#使用LitJson解析JSON(转)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Decembe ...
- DEV TdxLayoutGroup设置tab
TdxLayoutGroup 属性的 LayoutDirection :ldvertical,ldtabbed(显示tab页),ldhorizontal
- java 垃圾回收总结(可达性分析 引用分类
java 垃圾回收总结(1) 以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆. java与C,c++有很大的不同就是java语言开发者不 ...
- 数据库出现1045 access denied for user 'root'@'localhost' using password yes (转)
在mysql命令行中执行 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); GRANT ALL PRIVILEGES ON *.* ...
- HDU 1532 最大流入门
1.HDU 1532 最大流入门,n个n条边,求第1点到第m点的最大流.只用EK做了一下. #include<bits/stdc++.h> using namespace std; #pr ...
- Java中的DateFormatter
字母 日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul;07 w 年中的周数 Number 27 W ...
- Java中自己实现枚举
public class MyEnum { private final String name; public static final MyEnum red = new MyEnum(" ...
- MVC5笔记【一】
一.global.asax文件的作用:全局性配置文件 理解什么是路由? 有什么作用: 路由主要提供一个路由表 请求的时候被加载,请求url要去路由表当中去对照 规则 解析规则 控制器/动作放方法,转移 ...
- Java 反射 Class对象
Java 反射 Class对象 @author ixenos 关键字:RTTI.动态绑定.动态加载.获得Class引用.泛型Class引用.newInstance的坑.JVM中的泛型类型信息 RTTI ...
- 2016弱校联盟十一专场10.2——Around the World
题目链接:Around the World 题意: 给你n个点,有n-1条边,现在这n-1条边又多增加了ci*2-1条边,问你有多少条欧拉回路 题解: 套用best定理 Best Theorem:有向 ...