python爬虫之urllib库的使用

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库的基本使用





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值