爬取 PTT 文章标题
这篇文章会使用 Python 的 Requests 和 Beautiful Soup 函数库,实作一个网络爬虫,利用传送 cookie 的方式,突破未满十八岁的按钮检查限制,取得 PTT 八卦版文章的标题,并更进一步使用 txt 储存。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
什么是 PTT 八卦板
PTT 八卦版是一个 BBS 分享八卦的空间,除了正常使用 BBS 登录浏览,也可以透过浏览器,进行单纯的网页浏览。
使用 Requests 抓取网页内容
使用 Requests 函数库之后,就能使用 get 的方法抓取 PTT 八卦版的网页内容。
参考:Requests 函数库
import requests
web = requests.get('https://www.ptt.cc/bbs/Gossiping/index.html')
print(web.text)
执行程序后,虽然可以正常抓取网页,但会发现抓到的内容与实际上的不同,出现了“看板内容需满十八岁方可浏览”的文字。
因为 PTT 八卦版的网页版,额外多了一层 Cookies 的验证手续,在没有点击过“我已满十八岁”按钮的情形下,会缺少 Cookies 相关信息,导致会多一页提示文字,下图是没有点击过按钮,单纯打开 PTT 八卦版页面的长相,Requests 就是抓取到这一页的信息。
Cookies 是指某些网站为了辨别用户身份而储存在用户端浏览器中的数据,Cookies 可以记录用户浏览时的信息,当用户存取另一个页面,浏览器会把 Cookies 传送给服务器,让服务器知道用户目前的状态。
传送 Cookies
用鼠标在页面的任意位置,按下右键,点选“检查”。
打开后点选“Application”页签,左侧选择 Cookies > https://www.ptt.cc,就可以看到浏览器记录了哪些 PTT 网站的 Cookies。
这时如果点击了“已经年满十八岁”的按钮,Cookies 里会多出一个 Name 是 over18,Value 是 1 的项目,这个项目就是判断是否出现这个页面的依据。
回到刚刚的 Python 程序,将 Cookies 的信息加入 Requests 的方法里,重新执行后,就会抓取到正确的网页内容 ( 下图红线的 tag 是要抓取的数据位置 )。
import requests
web = requests.get('https://www.ptt.cc/bbs/Gossiping/index.html', cookies={'over18':'1'}) # 加入 Cookies 資訊
print(web.text)
使用 Beautiful Soup 取得特定内容
取得网页内容后,使用 Beautiful Soup 函数库就能筛选出特定内容,下方的程序码执行后,会取得文章的标题以及超链接的网址。
import requests
from bs4 import BeautifulSoup
url = 'https://www.ptt.cc/'
web = requests.get('https://www.ptt.cc/bbs/Gossiping/index.html', cookies={'over18':'1'})
soup = BeautifulSoup(web.text, "html.parser")
titles = soup.find_all('div', class_='title') # 取得 class 為 title 的 div 內容
for i in titles:
if i.find('a') != None: # 判斷如果不為 None
print(i.find('a').get_text()) # 取得 div 裡 a 的內容,使用 get_text() 取得文字
print(url + i.find('a')['href'], end='\n\n') # 使用 ['href'] 取得 href 的屬性
使用纯文字文件 txt 储存数据
使用 Python 内建的 open 指令,就能使用纯文字文件 txt 文件,储存爬虫爬到的数据,下方的程序码将取得的数据,记录在 output 变数里,全部完成后将 output 的内容写入纯文字文件中 ( 每个人的纯文字文件路径可能不同,请依照自己电脑或 Colab 的路径为主 )。
import requests
from bs4 import BeautifulSoup
url = 'https://www.ptt.cc/'
web = requests.get('https://www.ptt.cc/bbs/Gossiping/index.html', cookies={'over18':'1'})
web.encoding='utf-8' # 避免中文亂碼
soup = BeautifulSoup(web.text, "html.parser")
titles = soup.find_all('div', class_='title')
output = '' # 建立 output 變數
for i in titles:
if i.find('a') != None:
# 將資料一次記錄到 output 變數裡
output = output + i.find('a').get_text() + '\n' + url + i.find('a')['href'] + '\n\n'
print(output)
f = open('/content/drive/MyDrive/Colab Notebookstest.txt','w') # 建立並開啟純文字文件 ( Colab 才需要 )
f.write(output) # 將資料寫入檔案裡
f.close()
小结
熟悉自动爬取文章标题的做法后,就能够应用在各种“静态网页”里,轻松收集各种想收集的数据 ( 动态网页内容会再另外的篇幅介绍 )。
微信扫码关注
抖音扫码关注