前言
大數據決賽要開始了,團隊裏數據爬取的任務就交給我吧
找到一個例題
讓我們來搞一手吧。
爬取前的準備
所用語言: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:])
這樣就得到了你想要的數據。
注意事項
爬取需謹慎,爬取到敏感、他人隱私信息是要坐牢的。