python爬虫主要分为三个部分:抓取、分析以及存储。
1、抓取:如何抓取网页内容呢?使用urllib2或者request抓取网页内容。
打开百度-图片,我们看到的是一张张精美的图片,这个过程其实是用户输入网址之后,经过DNS服务器解析,找到服务器主机,向主机申请访问,主机经过解析之后发送回浏览器HTML+JS+CSS等代码,浏览器对这些代码进行解析便可以看到我们申请访问的内容。
下面我们抓取百度首页的源码为例:
1、使用urllib2库
import urllib2
url= "http://www.baidu.com"
response = urllib2.urlopen(url)
print response.read()
将代码写入一个文件并保存,在相应的目录执行命令查看结果。
python e.py
传入url,这个是百度网页的首页,协议是HTTP协议,当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,这只是代表了一种访问控制协议,urlopen可以接受三个参数:
urlopen(url, data, timeout)
参数1:url就是我们将要访问的网址。
参数2:data是我们要上传到服务器的地址。
参数3:tiemout是超时时间。
当然第2、3个参数是可以不传送的,data默认为空None,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT。
方法返回一个response对象,返回的所有信息都保存在这个对象中。
使用该对象的read()方法,读取对象中的内容。
2、使用request
我们也可以使用request请求,Request类的实例,构造时传入url,data等内容。比如上面的两行代码,我们可以这么改写:
import urllib2
url = "http://www.baidu.com"
request = urllib2.Request(url)
response = urllib2.urlopen(request)
print response.read()
这种写法中间多一个request对象,建议大家如是写,因为有些时候我们爬取网页的时候,还要上传一些其他的信息,这时候使用request就会好很多,通过构建一个request(请求),服务器响应请求,这样更容易看明白。
上面的程序向大家展示了如何抓取静态网页的内容,不过大多数时候都是动态的,既需要你传递参数给它,比如登陆账号和密码。怎么办呢?这时候就用到了我们前面说的data参数了。
我们将需要上传的账号密码等信息,传送到url中,得到服务器的响应。
我们定义一个字典,名字为values,设置username和password,下面利用urllib的urlencode方法将字典编码,命名为data,构建request时传入两个参数,url和data,运行程序,返回的便是页面内容。
import urllib2
import urllib
url = "http://passport.xxxx.net/account/login"
values = {"account":"wdf880817@sina.com", "password":"xxxxxxx"}
data = urllib.urlencode(values)
geturl = url + '?' + data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()
字典的定义方式还有一种:
import urllib2
import urllib
url = "http://passport.xxxx.net/account/login"
values = {}
values["account"] = "wdf880817@sina.com"
values["password"] = "xxxxxxxxxx"
data = urllib.urlencode(values)
geturl = url + "?" + data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()
将geturl打印出来,我们得到
http://xxxxxx.csdn.net/account/login?account=wdf880817@sina.com&password=xxxxxxxx
这样我们就得到了http://xxxxxx.csdn.net网页中,账号密码分别为wdf880817@sina.com和xxxxxxxx的用户的相关数据。