1.爬取百度的源码
爬网页就是根据URL来获取它的网页信息,源码里面有HTML代码,加JS、CSS,其中最重要的部分在HTML代码中
from urllib.request import urlopen import urllib html=urlopen('http://www.baidu.com') response=html.read() print(response)D:\Anaconda3\python.exe D:/dazhongdianping/position.py
b'<!DOCTYPE html>\n<!--STATUS OK-->\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n \r\n\t\t\t \r\n\t\r\n\t\t\t \r\n\t\r\n\t\t\t \r\n\t\r\n\t\t\t \r\n\t\t\t \r\n\r\n\t\r\n \r\n\t\t\t \r\n\t\r\n\t\t\t \r\n\t\r\n\t\t\t \r\n\t\r\n\t\t\t \r\n\t\t\t \r\n\r\n\r\n\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\n\n<html>\n<head>\n \n <meta http-equiv="content-type" content="text/html;charset=utf-8">\n <meta http-equiv="X-UA-Compatible" content="IE=Edge">\n\t<meta content="always" name="referrer">\n <meta name="theme-color" content="#2932e1">\n <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />\n <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="\xe7\x99\xbe\xe5\xba\xa6\xe6\x90\x9c
要疯掉的 运行结果哈哈,截取了一小段
2.分析代码
首先从urllib.request库中导入urlopen方法,然后打开百度的首页,urlopen()方法一般接收三个参数urlopen(url,data,timeout)第一个参数url是必须要传送的,第二个参数data是访问url时要传送的数据,第三个是设置超时的时间,第二三个参数是可以不传送的。
打开百度首页以后,需要去读取这个网页,要用到read()方法,如果不加read()方法,会出现这样的结果。
<http.client.HTTPResponse object at 0x01B8CB30>
3.构造request
urlopen参数可以传入一个request请求,它其实就是Request类的一个实例,构造时,需要传入url,data等内容,如下:
开始运行出现的报错,因为python3后,urllib2就不能用了,所以应该改为:
request=urllib.request.Request('http://www.baidu.com') response=urllib.request.urlopen(request) print(response.read())
这样就可以正常运行,运行结果是一样的,只是中间多了一个request对象,这样写的好处是逻辑清晰,因为写一个完整的程序的时候,需要加入很多内容,这样写自己不会乱
4.post和get数据传送
上面的程序大多都是静态的数据抓取,不过现在大多数网站都是动态网页,需要你动态的传递参数给它,它做出对应的响应,最常见的传递数据就是登陆注册的时候。
数据传送分post和get两种方法,最重要的区别是get方式是直接以连接的形式访问,连接中包含了所有的参数,可以直观的看到自己提交了什么内容,post不会再网址上直接显示所有的参数,如果你想直接查看就不太方便。
post方式:
上面说的data是用来传递参数的,它就是用在post方式中的
import urllib.request import urllib.parse from urllib.request import urlopen values={'username':'1576307921@qq.com','password':'xxxxxxxx'} #定义字典,参数设置username和password data=urllib.parse.urlencode(values) #用urllib的urlencode方法将字典编码,命名为data url="https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn" request=urllib.request.Request(url,data) #构建request是传入两个参数,url和data response=urllib.request.urlopen(request) #接收参数 print(response.read()) #输出到页面上这是模拟登陆CSDN,但是登陆不进去,因为CSDN还有个流水号的字段没有设置全,在这里出现的问题是在将字典编码的时候,,urllib.urlencode不适用于python3版本,需要使用urllib.parse.urlencode。一般的登陆原理是这样。
GET方式:
get方式就是直接将参数写到网址上,直接构建一个带参数的url出来即可
import urllib.request import urllib.parse from urllib.request import urlopen values={'username':'1576307921@qq.com','password':'xxxxxxxx'} data=urllib.parse.urlencode(values) url="http://passport.csdn.net/account/login" geturl=url+'?'+data print(geturl) request=urllib.request.Request(geturl) response=urllib.request.urlopen(request) print(response.read()) 结果:http://passport.csdn.net/account/login?username=1576307921%40qq.com&password=xxxxxxxx
b'\n\n\n\n\n\n\n<html>\n <head>\n <meta charset="utf-8" />\n <meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n <meta property="qc:admins" content="24530273213633466654" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0"/>\n <title>\xe5\xb8\x90\xe5\x8f\xb7\xe7\x99\xbb\xe5\xbd\x95</title>\n \n \n <link type="text/css" rel="stylesheet" href="/css/bootstrap.css;jsessionid=9203DAC736157AF0A4F27070BD1E951B.tomcat1" />\n <link type="text/css" rel="stylesheet" href="/css/login.css;jsessionid=9203DAC736157AF0A4F27070BD1E951B.tomcat1" />\n <link type="text/css" rel="stylesheet" href="/css/weixinqr.css;jsessionid=9203DAC736157AF0A4F27070BD1E951B.tomcat1" />\n <script src="/js/apps/ga.js;jsessionid=9203DAC736157AF0A4F27070BD1E951B.tomcat1"></script>\n <script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>\n <!--[if lt IE 9]>\n <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>\n <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>\n <![endif]-->\n </head>\n <body>\n \t<div id="hidebg"></div>\n\t<div id="hidebox"><div id="close" onClick="hide();"></div><div id="wxqr"
显示的是部分结果,发现打印出的url就是原来的url+?然后加编码后的参数,和我们平时get访问方式一模一样,这样就实现了数据的get方式传送。
代码是自己敲打进去的,原文是python2 ,所以略有不同,问题是在运行中发现的,继续加油
参考出处:静觅 » Python爬虫入门三之Urllib库的基本使用