那些年我把北京科技大學給爬下來了!然而越來越喜歡北科大!
私信菜鳥007獲取原始碼哦!
我們的目標是關注帖子的標題名稱,比如這個: “北郵人下載需要流量嗎” , “請問一下學長學姐,全國大學生數學競賽初賽全國一等獎在咱們學校” 。
還有就是我們肯定不能只爬取一頁的資訊,這裡我們將要爬取前1000頁的資訊。
頁面分析
首先我們開啟Chrome開發者工具看一下列表如何解析。
這裡我們選中一個標題名稱後,可以直接看到一個 a 標籤,它的class為 j_th_tit 。
所以使用以下程式碼就可以打印出所有的標題來。
進群:960410445 即可獲取數十套PDF!
soup = BeautifulSoup(resp.content, "html.parser") items = soup.find_all("a", {"class", "j_th_tit"}) for a in items: title = item.get_text() print(title)
分頁分析
頁面分析完了之後就可以分析一下分頁了,我們把小箭頭晃到底部分頁的位置。
可以發現分頁對應的網址主要是pn的值不一樣。第2頁對應50,第3頁對應100,第4頁對應150。
也就是,
pn=(page−1)∗50這樣的關係。
爬蟲編寫
完成以上的分析工作之後,就可以開始實現我們的爬蟲了。
資料庫操作
首先是資料庫的操作,這裡使用到 tieba 資料庫的 beike 集合。然後儲存文件的話就直接insert就好了。
def init_collection(): client = pymongo.MongoClient(host="localhost", port=27017) db = client['tieba'] return db["beike"] def save_docs(docs): beike.insert(docs) beike = init_collection()
任務初始化
下面,我們不編寫worker,而是先進行任務的初始化。
if __name__ == '__main__': crawler = SimpleCrawler(5) crawler.add_worker("worker", worker) for i in range(1, 11): crawler.add_task({"id": "worker", "page": i}) crawler.start()
這裡我們首先初始化 SimpleCrawler ,然後給新增 worker 以及 task 。
關於task,可以看到上面的程式碼通過迴圈,添加了10個任務,每個任務的page屬性不一樣。worker肯定是爬取某一頁並解析加入資料庫的程式碼,我們這裡其實就是添加了爬取前10頁的任務。
這裡雖然也可以寫直接新增爬取前1000頁的任務,但是考慮到實際情況下任務可能會非常多,為了讓任務佇列不溢位,開始可以少新增一些。
Worker編寫
接下來是 worker 的編寫。
首先worker肯定要有三個基礎部分:下載頁面、解析頁面、儲存資料。除此之外,因為要爬取1000頁,所以還要新增新的任務來爬取剩下的990。
這裡可以判斷當前頁碼+10是否大於1000,如果不大於的話把當前頁碼+10的網頁新增到新的任務佇列中。
def worker(queue, task, lock): offset = (task["page"] - 1) * 50 print("downloading: page %d" % task["page"]) # 1. 下載頁面 resp = requests.get("http://tieba.baidu.com/f?kw=" "%E5%8C%97%E4%BA%AC%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=" + str(offset)) soup = BeautifulSoup(resp.content, "html.parser") # 2. 解析頁面 items = soup.find_all("a", {"class", "j_th_tit"}) docs = [] for index, item in enumerate(items): docs.append({"page": task["page"], "index": index, "title": item.get_text()}) print(task["page"], index, item.get_text()) # 3. 儲存資料 with lock: save_docs(docs) # 4. 新增新任務 if (task["page"] + 10) > 1000: queue.put({"id": "NO"}) else: queue.put({"id": "worker", "page": task["page"] + 10})
執行效果
以上就是爬蟲的全部程式碼,執行後可以看到型別下面的結果。
通過以上程式碼大概爬了4萬多條資料,之後的兩章我們將把這些標題當做語料庫,做一個簡單的相關帖子推薦系統。
說明
網站可能會經常變化,如果上述爬蟲不能用的話,可以爬取我儲存下來的貼吧網頁: http://nladuo.cn/beike_tieba/1.html 。
分頁的格式類似於1.html、2.html、…、1000.html。