突然发现,这个世界果然还是技术人员的世界
关于糗事百科的一个爬虫,模仿他人代码而成,对于初步接触正则表达式,理解python面向对象编程该是很有帮助的,但是自我感觉最有意思的是,解决不知名问题的成功后的快感。
下面可以说是最折腾我的一个问题,所以只记录了他。
回头想想,说到底还是没有重视错误提示的原因。
错误版本:
# -- coding:utf-8 --
import urllib2
import re
class BaikeSpider:
def __init__(self):
self.pageIndex = 1
self.user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0'
self.headers = {'User-Agent': self.user_agent}
self.stories = []
self.enable = False
def getPage(self, pageIndex):
try:
url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
request = urllib2.Request(url, headers=self.headers)
response = urllib2.urlopen(request)
pageCode = response.read().decode('utf-8')
return pageCode
except urllib2.URLError, e:
if hasattr(e, 'reason'):
print u"连接糗事百科失败,错误原因为:", e.reason
return None
def getPageItems(self, pageIndex):
pageCode = self.getPage(pageIndex)
if not pageCode:
print "页面加载失败"
return None
expression = \
'<div class="author clearfix">.*?<img.*?" alt="(.*?)"/>.*?' \
'<div class="content">(.*?)</div>.*?<span class="stats-vote">' \
'<i class="number">(.*?)</i>.*?<a href.*?<i class="number">(.*?)' \
'</i>.*?</a>'
pattern = re.compile(expression, re.S)
items = re.findall(pattern, pageCode)
pageStories = []
for item in items:
replaceBR = re.compile('<br/>')
text = re.sub(replaceBR, '\n', items[1])
#0是发布人,1是内容,2是点赞数,3是评论数
pageStories.append([item[0].strip(), text.strip(), item[2].strip(), item[3].strip()])
return pageStories
def loadPage(self):
if self.enable == True:
if len(self.stories) < 2:
pageStories = self.getPageItems(self.pageIndex)
if pageStories:
self.stories.append(pageStories)
self.pageIndex += 1
def getOneStory(self, pageStories, page):
for story in pageStories:
inputs = raw_input()
self.loadPage()
if inputs == "Q":
self.enable = False
return
print u"第%d页\t发布人:%s\n段子:%s\n赞:%s\n评论:%s" % (page, story[0], story[1], story[2], story[3])
def start(self):
print u"正在读取糗事百科,按回车查看新段子,Q退出"
self.enable = True
self.loadPage()
nowPage = 0
while self.enable:
if len(self.stories) > 0:
pageStories = self.stories[0]
nowPage += 1
del self.stories[0]
self.getOneStory(pageStories, nowPage)
spider = BaikeSpider()
print spider.start()
报错:
G:\python27\python.exe D:/编程/PY/test_new.py
正在读取糗事百科,按回车查看新段子,Q退出
(由于路径是中文,路径编码问题就不用管了,暂时没有影响)
Traceback (most recent call last):
File "D:/���/PY/test_new.py", line 76, in <module>
print spider.start()
File "D:/���/PY/test_new.py", line 66, in start
self.loadPage()
File "D:/���/PY/test_new.py", line 49, in loadPage
pageStories = self.getPageItems(self.pageIndex)
File "D:/���/PY/test_new.py", line 41, in getPageItems
text = re.sub(replaceBR, '\n', items[1])
File "G:\python27\lib\re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or buffer
Process finished with exit code 1
错误里很明确的表示出错误所在:
spider.start()->self.loadPage()->pageStories = self.getPageItems(self.pageIndex)-> text = re.sub(replaceBR, '\n', items[1])
以上表明了当前文件里的错误位置,应该是在sub()这里。仔细检查对应区域,可以发现,原来是第三个参数写错了。。。
应该是item[1]
结果此下:
G:\python27\python.exe D:/编程/PY/test_new.py
正在读取糗事百科,按回车查看新段子,Q退出
第1页 发布人:爱生活爱扯淡
段子:等了两个月的抽油烟机维修员今天终于来了,然后对着图纸絮絮叨叨地摆弄了半个多小时,。火花一闪,一缕黑烟,成功地烧毁了主板,并且停了我家的电。
赞:3788
评论:85
Q
Process finished with exit code 0
面临的问题:
1. 随着网站的改版升级,代码可能会失效。
大多数是因为,正则表达式规则不再适用于新的代码,因为迟迟不能出现结果。
对于此类,最直接的方法就是,重看网页源代码(用浏览器很方便),相应更改就好。
2. 现在的匹配速度感觉一般。
暂时不了解怎样的表达式执行效率更高,还有待学习与加强。
3. 代码的内容还是可以有删减的。
随着目的的不同,可以适当的提取使用。