# -*- coding:utf-8 -*- #仅仅实现逻辑,高级需求自行修改 #引入库 import urllib import urllib2 import re #抓取某页 page = 1 url = 'http://www.qiushibaike.com/hot/page/' + str(page) user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = { 'User-Agent' : user_agent } try: request = urllib2.Request(url,headers = headers) response = urllib2.urlopen(request) # print response.read() content = response.read().decode('utf-8','ignore') pattern = re.compile('<div.*?class="author.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class="content.*?>(.*?)<!--.*?-->.*?<div class="stats.*?class="number">(.*?)</i>',re.S) items = re.findall(pattern,content) for item in items: print item[0],item[1],item[2] except urllib2.URLError, e: if hasattr(e,"code"): print e.code if hasattr(e,"reason"): print e.reason
urllib2库里面的urlopen方法,传入一个URL,协议是HTTP协议,当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,只是代表了一种访问控制协议,urlopen一般接受三个参数,它的参数如下:
urlopen(url, data, timeout)
第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。
第二三个参数是可以不传送的,data默认为空None,timeout默认为 socket._GLOBAL_DEFAULT_TIMEOUT
第一个参数URL是必须要传送的,在这个例子里面我们传送了URL,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。
其实上面的urlopen参数可以传入一个request请求,它其实就是一个Request类的实例,构造时需要传入Url,Data等等的内容。
values = {"username":"xxxxxxx","password":"XXXX"} data = urllib.urlencode(values) ##########两种方式 values = {} values['username'] = "xxxxxxx" values['password'] = "XXXX" data = urllib.urlencode(values) ############post request = urllib2.Request(url,data,headers = headers) response = urllib2.urlopen(request) #############get geturl = url + "?"+data request = urllib2.Request(geturl) response = urllib2.urlopen(request) print response.read()
现在正则表达式在这里稍作说明
1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。
2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。
3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。
重点说明
方法:
urllib.urlencode(字典数据) urllib2.Request(url,data,headers = headers) urllib2.urlopen(request) response.read().decode('utf-8','ignore')#防止编码html(不是每次都要的) re.compile(正则) re.findall(pattern,content)#找到所有的