python爬虫爬取NBA贴吧的所有精品贴

2017-09-12 14:36:46来源:oschina作者:zhaobig人点击

分享
首先用直接的方法写,先尝试下能否爬取成功 #coding:utf-8 import urllib2,urllib
import re
''' 1.准备url地址 2.准备请求头 3.创建请求对象 4.发起请求获取第一页源代码,接收响应 5.通过第一页源代码,找到总页数和标题 6.for循环执行总页数次6.1 根据页码拼接完整的URL地址6.2 创建request对象,发起请求,接受响应6.3 根据正则匹配数据,包含用户名和帖子内容6.4 去除、替换数据中的html标签6.5 写入本地文件 ''' ide = raw_input('请输入要爬取的帖子的编号:')
#1准备url地址 url = 'https://tieba.baidu.com/p/'+ide
#2准备请求头 headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50' }
#3创建请求对象 request = urllib2.Request(url,headers=headers)
#4发起请求获取第一页源代码,接受响应 response = urllib2.urlopen(request)
# 5.通过第一页源代码,找到总页数和标题 #5.1准备正则 pattern = re.compile(r'(.*?)',re.S)
#5.2查找对应正则的数据 html = response.read()
rs = re.search(pattern,html)
#5.3把字符串页数转换为数字 total = int(rs.group(1))
# 5.4 正则匹配标题 tit_pattern = re.compile(r'#打开文件 file = open(filename,'w')
print '正在爬取%s,共%s页数据'%(title,total)
#6.for循环执行总页数次 for x in range(1,total+1):
print '正在爬取第%s页数据'%x
# 6.1根据页码拼接完整的URL地址getUrl = url+'?pn=%s'%x
# 6.2创建request对象,发起请求,接受响应request = urllib2.Request(getUrl,headers=headers)
response = urllib2.urlopen(request)
html = response.read()
# 6.3根据正则匹配数据,包含用户名和帖子内容con_pattern = re.compile(r'(.*?).*? #创建request对象
request = urllib2.Request(getUrl,headers=self.headers)
try:
#发起请求接收响应
response = urllib2.urlopen(request)
except(urllib2.HTTPError,Exception),e:
print '获取第%s页数据失败,原因%s'%(pageNum,e)
return None
else:
#如果没有异常,返回html源代码
return response.read()
#从第一页中提取总页数和标题
def get_title_total(self,html):
#1.准备正则
tit_pattern = re.compile(r'(.*?)',re.S)
# 2 查找
total_rs = re.search(total_pattern,html)
# 3 记录总页数
self.total = int(total_rs.group(1))
#从html源代码中提取数据
def get_data(self,html):
# 1 准备正则
pattern = re.compile(r'(.*?).*? results = re.findall(pattern,html)
return results
def start(self):
#1.获取精品贴的HTML源代码
html = self.get_page()
#2.从精品贴源代码中提取帖子编号
results = self.get_data(html)
#for 循环遍历帖子编号,爬取内容
#创建BDTB对象,传入帖子编号
for numbers in results:
bdtb = BDTB(numbers)
bdtb.start()
time.sleep(2)
if __name__ == '__main__':
jpt = JPT()
jpt.start()

微信扫一扫

第七城市微信公众平台