Skip to content

Commit f681051

Browse files
committed
add tieba spider
1 parent d210ec8 commit f681051

File tree

9 files changed

+714
-1
lines changed

9 files changed

+714
-1
lines changed

0-Spider/tiebaSpider/.idea/misc.xml

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0-Spider/tiebaSpider/.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0-Spider/tiebaSpider/.idea/tiebaSpider.iml

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0-Spider/tiebaSpider/.idea/workspace.xml

Lines changed: 358 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0-Spider/tiebaSpider/README.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,21 @@
1-
test
1+
# 项目说明
2+
3+
该项目为爬取指定贴吧的前三页帖子的发帖用户和回帖用户的用户名
4+
5+
data 目录为存放数据的目录,其中以天为单位创建二级目录,以贴吧名为三级单位存储抓取结果
6+
7+
目录结构类似于:
8+
9+
data
10+
--20170626
11+
-----戒赌吧.txt
12+
-----网易吧.txt
13+
14+
tiebaname 目录为存放贴吧名字的目录,将要爬取的贴吧名字写入该目录下的name.txt文件中
15+
16+
目录结构类似于:
17+
18+
tiebaname
19+
--name.txt
20+
21+
采用的是python 的beautifulSoup库,效果不太理想,但后续会逐步改善,可能换成别的框架

0-Spider/tiebaSpider/main.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# coding: utf-8
2+
3+
from spider import Spider
4+
5+
if __name__ == "__main__":
6+
import time
7+
print("Start At:",time.asctime( time.localtime(time.time()) ))
8+
spider = Spider()
9+
spider.start()
10+
print("Stop At:",time.asctime( time.localtime(time.time()) ))

0-Spider/tiebaSpider/spider.py

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# coding: utf-8
2+
3+
from bs4 import BeautifulSoup
4+
import urllib2
5+
import urllib
6+
import time,os
7+
8+
class Spider:
9+
10+
def __init__(self):
11+
self.search_url = 'https://tieba.baidu.com/f?kw='
12+
self.tieba_list = [] # 存储要爬取的若干个贴吧的链接
13+
self.url_list = [] # 存放每个贴吧前三页的帖子链接
14+
self.timesleep = 2 # 每次访问tieba的url时间间隔
15+
self.pages = 3 # 设置要抓取多少页
16+
self.current_href = '' # 当前爬取的贴吧链接url
17+
18+
# 在data目录下创建日期和贴吧名的txt文件
19+
if not os.path.exists('data/%s' % time.strftime('%Y%m%d')):
20+
os.mkdir('data/%s' % time.strftime('%Y%m%d'))
21+
22+
def error(self,loc,url,e):
23+
fw = open("error/error.log","a")
24+
fw.write(time.asctime( time.localtime(time.time()) )+"\t"+loc+"\t"+url+"\t"+str(e))
25+
fw.close()
26+
27+
# 模拟浏览器进行登录
28+
def get_page(self,href):
29+
res = urllib2.urlopen(href)
30+
# 如果访问成功的话返回读取的内容,否则返回空的字符串
31+
if res.code == 200:
32+
return res.read()
33+
else:
34+
return ""
35+
36+
# 从文件中加载贴吧名并组成url
37+
def read(self):
38+
try:
39+
with open("tiebaname/name.txt", "r") as fr:
40+
for line in fr.readlines():
41+
# urllib.quote(line.strip()) 将关键字转变成url 格式
42+
self.tieba_list.append(self.search_url + urllib.quote(line.strip()) + "&ie=utf-8&pn=")
43+
fr.close()
44+
except Exception as e:
45+
self.error("read", "read error", e)
46+
pass
47+
finally:
48+
return self.tieba_list
49+
50+
51+
# 解析每个帖子共有几页
52+
def get_num(self,url):
53+
try:
54+
if self.get_page(url):
55+
body = BeautifulSoup(self.get_page(url), "html.parser")
56+
num_li = body.find_all("li", class_="l_reply_num", style="margin-left:8px")[0]
57+
num = num_li.findAll('span', class_='red')[1].get_text()
58+
# print(num)
59+
return int(num)
60+
else:
61+
pass
62+
except Exception as e:
63+
self.error("get_num",url,e)
64+
return 1
65+
66+
# 解析每一个贴吧前三页的所有帖子连接
67+
def parse_href(self,one_tieba_url):
68+
self.url_list = [] # 存放一个贴吧前三页所有帖子的链接
69+
try:
70+
for i in range(0,self.pages):
71+
url = one_tieba_url + str(i * 50)
72+
try:
73+
# i* 50 控制翻页,每页显示50个
74+
if self.get_page(one_tieba_url+str(i*50)):
75+
body = BeautifulSoup(self.get_page(url), "html.parser")
76+
div_list = body.find_all("div", class_="threadlist_title pull_left j_th_tit ") # 解析到每一个帖子
77+
for div in div_list:
78+
# print(div.a.get('href'),div.a.get_text())
79+
# print("https://tieba.baidu.com" + div.a.get('href'))
80+
self.url_list.append("https://tieba.baidu.com" + div.a.get('href'))
81+
else:
82+
pass
83+
except Exception as e:
84+
self.error("parse_href",url,e)
85+
pass
86+
# time.sleep(self.timesleep)
87+
except Exception as e:
88+
self.error("parse_href",one_tieba_url,e)
89+
pass
90+
91+
# 解析每个贴吧前三页所有帖子的发帖人和回帖人的用户名
92+
def parse_username(self):
93+
try:
94+
# 解析每个帖子对应的发帖人和回帖人
95+
for url in self.url_list:
96+
filename = urllib.unquote(self.current_href.split("kw=")[1].split("&ie=")[0]) # 贴吧名字,也是文件名
97+
fw = open('data/%s/%s.txt' % (time.strftime('%Y%m%d'), filename), 'a')
98+
99+
try:
100+
fw.write(url+"\t")
101+
num = self.get_num(url)
102+
for i in range(1,num+1):
103+
one_url = url+"?pn="+str(i) # https://tieba.baidu.com/p/5183701449?pn=1
104+
# print("total %s papges, now parse is %s page,url is:%s"%(num,i,one_url))
105+
# 解析用户名
106+
if self.get_page(one_url):
107+
li_list = BeautifulSoup(self.get_page(one_url), "html.parser").find_all('li',class_='d_name')
108+
for li in li_list:
109+
# print(li.a.get_text())
110+
fw.write(li.a.get_text().encode("utf-8")+"\t")
111+
# time.sleep(self.timesleep)
112+
else:
113+
pass
114+
fw.write("\n")
115+
fw.close()
116+
print(url)
117+
except Exception as e:
118+
self.error("parse_username",url,e)
119+
pass
120+
121+
time.sleep(self.timesleep)
122+
except Exception as e:
123+
self.error("parse_username",url,e)
124+
pass
125+
126+
def start(self):
127+
self.read() # load tieba_prepare name
128+
for url in self.tieba_list:
129+
try:
130+
self.current_href =url
131+
print("Start:",self.current_href,time.strftime("%Y-%m-%d %H-%M-%S")) #self.current_href,
132+
self.parse_href(url) # 解析该贴吧对应的前三页的每个帖子的链接
133+
self.parse_username() # 解析每个帖子的发帖人和回帖人
134+
except Exception as e:
135+
self.error("start","parse error at start",e)
136+
pass
137+
138+
time.sleep(self.timesleep)
139+
print("Over:",time.strftime("%Y-%m-%d %H-%M-%S"))

0-Spider/tiebaSpider/spider.pyc

5.02 KB
Binary file not shown.
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
戒赌
2+
足彩
3+
福彩
4+
汉中彩票
5+
体彩
6+
竞彩
7+
双色球
8+
深圳
9+
上海
10+
北京
11+
武汉
12+
福建
13+
浙江
14+
广州
15+
哈尔滨
16+
吉林
17+
青岛
18+
杭州
19+
山东
20+
重庆
21+
nba
22+
曼联
23+
科比
24+
皇家马德里
25+
巴塞罗那
26+
切尔西
27+
ac米兰
28+
北京国安
29+
山东鲁能
30+
国际米兰
31+
拜仁慕尼黑
32+
火箭
33+
广州FC
34+
詹姆斯
35+
麦迪
36+
利物浦
37+
阿森纳
38+
尤文图斯
39+
洛杉矶湖人
40+
上海申花
41+
热火
42+
梅西
43+
德国队
44+
江苏舜天
45+
小小罗
46+
天津泰达
47+
死飞
48+
欧洲杯
49+
中超
50+
cba
51+
河南建业
52+
曼城
53+
国足
54+
意大利国家队
55+
多特蒙德
56+
英超
57+
中国足球
58+
库里
59+
内马尔
60+
罗伊斯
61+
足球
62+
篮球
63+
网球
64+
浙江绿城
65+
苹果
66+
iphone
67+
长春亚泰
68+
英格兰
69+
辽宁宏运
70+
贵州人和
71+
上海东亚
72+
重庆力帆
73+
西甲
74+
马德里竞技
75+
德甲
76+
世界杯
77+
艾弗森
78+
韦德
79+
马刺
80+
易建联
81+
北京金隅
82+
广东宏远
83+
李毅
84+
扒皮
85+
美女
86+
小米
87+
电影
88+
内涵
89+
动漫
90+
nba
91+
头像
92+
遮天
93+
exo
94+
爆照
95+
减肥
96+
鹿晗
97+
神回复
98+
dota
99+
文字控
100+
心理学
101+
美食
102+
校花
103+
绿帽子小同学
104+
旅行
105+
小说
106+
笑话
107+
90后
108+
高考
109+
权志龙
110+
吴亦凡
111+
手绘
112+
梦幻西游
113+
旅游
114+
dota2
115+
les
116+
胥渡
117+
爱情
118+
整形
119+
隆鼻
120+
腐女
121+
gay
122+
搞笑
123+
柯南
124+
剑网
125+
凡人修仙
126+
周杰伦
127+
刘诗诗
128+
爱情公寓
129+
陈奕迅
130+
李敏浩
131+
音乐
132+
bigbang
133+
帅哥
134+
淘宝
135+
进击的巨人
136+
张杰
137+
网名
138+
魅族
139+
手机
140+
短句
141+
张艺兴
142+
金秀贤
143+
手工
144+
路过的一只
145+
娱乐圈
146+
内涵图
147+
章鱼卡
148+
君似毒
149+
黄子韬
150+
秦时明月
151+
杨幂
152+
言情小说
153+
化妆
154+
天天酷跑
155+
情感
156+
2012
157+
恐怖
158+
维尼夫妇
159+
整容
160+
vae
161+
爱所以存在
162+
吴世勋
163+
吃货

0 commit comments

Comments
 (0)