Python3跟Python2的区别:
1:只有print()函数,没有print函数
2:只有range()函数,没有arange()函数hasattr(object(对象),name(属性)):检查给定的对象是否有指定的属性
- #coding=utf-8:用于整个代码开头,表示代码全局不管是编码还是解码都用的utf-8形式
- re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符,即匹配任意字符
- self表示类的实例
class test:
def prt(self):
t=test()
t.prt()其实就是test.prt(t) - u.encode(‘utf-8’)中u代表unicode(一种字符串形式,即文本),python3中u跟s 都代表字符串,bytes由str通过encode(解码)方法转化得到,str由bytes通过decode(编码)方法转化得到,bytes具有string类型的所有操作 例:(网页打开方式)pageCode = response.read().decode(‘utf-8’) (注:此时pagecode里面可以显示中文字符,中文字符也算一种字符串)(文本打开方式)
import codecs,sys
f=codecs.open(path,'r','gbk')
例:1:def getPage(self,pageNum):
try:
url = self.baseURL+ self.seeLZ + '&pn=' + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
return response.read().decode('utf-8')(第一步:获取网页html代码后,进行编码)
2: def getContent(self,page):
#匹配所有楼层的内容
pattern = re.compile('<div id="post_content_.*?>(.*?)</div>',re.S)
items = re.findall(pattern,page)
contents = []
for item in items:
#将文本进行去除标签处理,同时在前后加入换行符
content = "\n"+self.tool.replace(item)+"\n"
contents.append(content.encode('utf-8'))(第二步:进行解码,只有这样才能实现contents.append操作)
return contents
3:def writeData(self,contents):
#向文件写入每一楼的信息
for item in contents:
if self.floorTag == '1':
#楼之间的分隔符
floorLine = "\n" + str(self.floor) + u"-----------------------------------------------------------------------------------------\n"
self.file.write(floorLine)
self.file.write(item.decode('utf-8'))(第三步:将编码后的代码写入文件中)
self.floor += 1
- s.strip()去除字符串首尾空格,s.strip(‘chars’)使chars中的每个字符均不出现在s的首尾中
- import urllib.request as request
import urllib.parse as parse
import urllib.error as error
import re
例:req=request.Response(url)
response=request.urlopen(req)
return response.read().decode(‘utf-8’)
7:所有外来输入的信号都需要初始化,如URL变成self.URL:
(#百度贴吧爬虫类 )
class BDTB:
(#初始化,传入基地址,是否只看楼主的参数)
def init(self,baseUrl,seeLZ,floorTag):
#base链接地址
self.baseURL = baseUrl
#是否只看楼主
self.seeLZ = ‘?see_lz=’+str(seeLZ)
#HTML标签剔除工具类对象
self.tool = Tool()
#全局file变量,文件写入操作对象
self.file = None
#楼层标号,初始为1
self.floor = 1
#默认的标题,如果没有成功获取到标题的话则会用这个标题
self.defaultTitle = u”百度贴吧”
#是否写入楼分隔符的标记
self.floorTag = floorTag
print u”请输入帖子代号”
baseURL = ‘http://tieba.baidu.com/p/’ + str(raw_input(u’http://tieba.baidu.com/p/‘))
seeLZ = raw_input(“是否只获取楼主发言,是输入1,否输入0\n”)
floorTag = raw_input(“是否写入楼层信息,是输入1,否输入0\n”)
bdtb = BDTB(baseURL,seeLZ,floorTag)
bdtb.start()
9:
1:当需要爬取重复性内容时,如内容是,用findall()函数,从item[0]开始
content = response.read().decode('utf-8')
pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+
'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,content)
for item in items:
print item[0],item[1],item[2],item[3],item[4]
2:当需要爬取单独性内容时,如标题时,用search()函数,从group(1)
#获取帖子标题
def getTitle(self):
page = self.getPage(1)
pattern = re.compile('<h1 class="core_title_txt.*?>(.*?)</h1>',re.S)
result = re.search(pattern,page)
if result:
#print result.group(1) #测试输出
return result.group(1).strip()
else:
return None
此时输出:纯原创我心中的NBA2014-2015赛季现役50大(标准纯文本,不带格式)
但如果是group(0)时,输出: