# -*- 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对象,返回信息便保存在这里面。
Requset
其实上面的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)#找到所有的