初学Python爬虫,学习资料是这篇博客:Python爬虫入门教程 下面列出一个爬糗事百科的例子巩固一下。
# 程序:糗百爬虫
# 语言:Python 2.7
# 操作:输入quit退出阅读糗事百科
# 功能:按下回车依次浏览今日的糗百热点
import urllib2,re,time,thread
class Spider_Model:
#类初始化
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
#将所有的段子都扣出来,添加到列表中并且返回列表
def GetPage(self,page):
myUrl = "http://www.qiushibaike.com/8hr/page/" + str(page) + "/?s=4915752"
#伪装成浏览器
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
headers = {'User-Agent':user_agent}
req = urllib2.Request(myUrl,headers=headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read()
#如果你出现了乱码,可以decode解码
unicodePage = myPage.decode('utf-8')
#段子都在class="content"的div标记的<span>内部,正则表达式匹配一下。
#最后的re.S表示.可以匹配换行符(.本来是匹配除换行符外的任意字符),.*?即非贪婪匹配任意字符,
#\n+表示一个或多个空格,中间括号中的内容就是我们要找的段子,以列表形式存在myItems中(type()可以查看类型,以循环方式打印输出不会有乱码)。
myItems=re.findall('<div.*?class="content">\n+<span>(.*?)</span>\n+</div>',unicodePage,re.S)
#print type(myItems)
#for item in myItems:
# print item
return myItems
#后台线程加载新的段子,存在列表pages中
def LoadPage(self):
#如果用户未输入quit,则一直运行
while self.enable:
#如果pages数组中的内容小于2个,就获取新页面中的段子
if len(self.pages) < 2:
try:
myPage = self.GetPage(self.page)
self.page += 1
#append函数是向列表末尾添加元素
self.pages.append(myPage)
except:
print '无法获取下一页内容'
else:
#5是推迟执行的秒数(即休眠5秒),使用前要import time
time.sleep(5)
#显示页面
def ShowPage(self,nowPage,page):
#以u开头的字符串表示unicode字符串,以r开头的字符串表示忽略转义
print u'第%d页:' % page
#循环输出
for i in nowPage:
#replace()是替换函数,把前边的字符串替换为后边的字符串
print i.replace('<br/>','')
#启动函数,同时启动了新线程
def Start(self):
self.enable = True
page = self.page
print u'正在新建一个线程在后台加载段子并存储……'
#启动新线程,前一个参数是要调用的线程函数,后者是要传给它的参数
thread.start_new_thread(self.LoadPage,())
while self.enable:
#如果self.pages中有元素,就调用ShowPage函数
if self.pages:
nowPage = self.pages[0]
del self.pages[0]
self.ShowPage(nowPage,page)
page += 1
print u'如果要退出后台进程,请输入quit'
#raw_input()是接受输入,参数可以直接打印出来,str()是转换成字符串类型
myInput = str(raw_input(u'输入quit退出,或回车继续:'))
if myInput == 'quit':
self.enable = False
#程序入口
myModel = Spider_Model()
myModel.Start()
整体运行流程:实例化一个类后,调用函数start,然后函数Loadpage开启线程并调用GetPage获得段子内容,通过showpage输出段子内容。