前言
大数据决赛要开始了,团队里数据爬取的任务就交给我吧
找到一个例题
让我们来搞一手吧。
爬取前的准备
所用语言:python
所用的库:bs4,requests,urllib,re
这两个库是一定没有的,我们需要下载:
pip install beautisoup4
pip install requests
其他两个库如果没有的话也自行pip下载。
如果你连pip都没有的话回头另讲:
爬取时
目标网站
先附上爬取代码:
import requests
import re
from bs4 import BeautifulSoup
from urllib import request
url = 'https://www.discuz.net/forum-10-1.html'
res = request.urlopen(url)#打开链接
print(res)
soup = BeautifulSoup(res,'html.parser')#返回网页源代码
#然后我们在用find去找相关标签包含的东西
t_div = soup.findAll('a',attrs={"c":"1"})
a = 1
author = []
# author's name
for i in t_div:
if a%2 == 0:
a += 1
continue
a += 1
author.append(i.text)
th = soup.findAll('a',attrs={"class":"showcontent y"})
d = str(th)
tid = re.findall('\'\d+\'',d)
uid = re.findall('uid=\d+',str(t_div))
print("tid", " author", "uid")
for i in range(len(tid)):
print (tid[i][1:-1],author[i],uid[i][4:])
这里面是不是有个 c = 1,所以下面这句话就是用来获得所有c=1的a标签的内容
t_div = soup.findAll('a',attrs={"c":"1"})
如果我们直接用for循环遍历的话,会发现他把作者和最后发言人一块给记录下来了。那我们就隔一个输出一个不就行了。
用户名爬取完成,再看看a标签中的href里发现这里有作者的uid,这里我们使用正则表达式来进行匹配。
uid = re.findall('uid=\d+',str(t_div))
这样就把uid以列表的形式储存在了uid里。
关于正则表达式,传送链接:正则表达式
用户id也爬取完成了,我们再找找帖子的tid:
很容易发现这里有个CONTENT_TID我们也使用正则表达式给他匹配出来
th = soup.findAll('a',attrs={"class":"showcontent y"})
d = str(th)
tid = re.findall('\'\d+\'',d)
我们这样就可以把a标签中含有class为‘showcontent y’的搜集出来,然后匹配出TID储存到TID里。
为了匹配的准确性,我在匹配的时候加了一些关键字:UID里我使用了uid=xxxx
这时候我们再用切片给它删掉,这样就是正常的UID了,TID同理把头和尾的双引号去掉。
for i in range(len(tid)):
print (tid[i][1:-1],author[i],uid[i][4:])
这样就得到了你想要的数据。
注意事项
爬取需谨慎,爬取到敏感、他人隐私信息是要坐牢的。