urllib 是python内置的基本库,提供了一系列用于操作URL的功能,我们可以通过它来做一个简单的爬虫。
0X01 基本使用
简单的爬取一个页面:
import urllib2 request = urllib2.Request("http://www.cnblogs.com") response = urllib2.urlopen(request) print response.read()
GET方式
import urllib import urllib2 values ={"id":1} data=urllib.urlencode(values) url="http://192.168.125.129/config/sql.php" geturl=url+"?"+data request =urllib2.Request(url) response =urllib2.urlopen(request) print response.read()
POST方式
import urllib import urllib2 url="http://192.168.125.129/config/sql.php" values ={"id":1} data=urllib.urlencode(values) request = urllib2.Request(url,data) response=urllib2.urlopen(request) print response.read()
0X02 高级用法
1、设置Headers
部分网站做了反爬虫策略,通过上面的程序,可能会获取不到内容,这时候我们可以模拟浏览器的工作,设置一些Headers 的属性。
import urllib import urllib2 url="http://192.168.125.129/config/sql.php" values ={"id":1} data=urllib.urlencode(values) headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'} request=urllib2.Request(url,data,headers) response =urllib2.urlopen(request) print response.read()
常见的headers属性
User-Agent : 浏览器类型,有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
application/json : 在 JSON RPC 调用时使用
application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用
在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务
另外,对付防盗链,可以在headers中加入referer。
2、设置Timeout
urllib2.urlopen方法,如果第二个参数data为空那么要特别指定是timeout是多少,写明形参,如果data已经传入,则不必声明。
import urllib import urllib2 url="http://192.168.125.129/config/sql.php" response = urllib2.urlopen(url, timeout=10) import urllib import urllib2 url="http://192.168.125.129/config/sql.php" values ={"id":1} data=urllib.urlencode(values) response = urllib2.urlopen(url, data,10)
3、异常处理
当程序异常时,需要用try-except语句来包围并捕获相应的异常,否则程序将终止。
import urllib import urllib2 url="http://192.168.125.129/config/sql22.php" values ={"id":1} data=urllib.urlencode(values) try: request = urllib2.Request(url,data) response=urllib2.urlopen(request) print response.read() except urllib2.HTTPError, e: print e.code print e.reason except urllib2.URLError, e: print e.reason else: print "ok"
这边使用URLError、HTTPError捕获异常,HTTPError是URLError的子类。
4、模拟登陆
利用cookie实现模拟登录,使用cookielib模块,代码示例:
import urllib import urllib2 import cookielib filename = 'cookie.txt' #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 cookie = cookielib.MozillaCookieJar(filename) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) postdata = urllib.urlencode({ 'username':'admin', 'password':'password' }) #登录的URL loginUrl = 'http://site/login.php' #模拟登录,并把cookie保存到变量 result = opener.open(loginUrl,postdata) #保存cookie到cookie.txt中 cookie.save(ignore_discard=True, ignore_expires=True) #利用cookie请求访问另一个网址,此网址是后台网址 comurl = 'http://site/index.php' #请求访问后台网址 result = opener.open(comurl) print result.read()
5、证书不匹配
证书不匹配问题 SSLError(CertificateError("hostname 'xxx.com' doesn't match 'test.xxx.org'"
对于python自带的 urllib库 解决办法
import ssl ssl.match_hostname = lambda cert, hostname: True