簡易python爬蟲 - 爬取站長論壇信息


爬取目標: 收集網站帖子里發帖人用戶名,發帖人ID;帖子的ID,發帖內容;網站title

 

提前需要准備的python庫

pip3 install requests //用於獲得網站的源碼

pip3 install bs4 //解析遍歷網站標簽

pip3 install urllib //解析網站的url

 

首先導入包

import requests
from bs4 import BeautifulSoup
from urllib.parse import parse_qs,urlparse

import json //導出文件的時候用json輸出

 

第一部: 獲取網站的源碼

def get_Web_content(url):
  response = requests.get(url)
  if response.status_code == 200:
    if '抱歉,指定的主題不存在或已被刪除或正在被審核' in response.text:
      return False
    else:
       return response.text

  else:
    return False

 

第二部: 獲取網站的源碼並且解析

def get_Web_Info(Content):
  soup = BeautifulSoup(Content,"html.parser")           //轉化為BS對象
  title = soup.title.string
  url = soup.link['href']
  parsed_url = urlparse(url)              //parsed_url講URL解析,最后返回字典對象(協議、位置、路徑、參數、查詢、片段).返回的查詢query之后會用到
  posted_url = parse_qs(parsed_url.query)       //parse_qs解析 parse_qs函數范圍的對象中的query查詢
  tid = posted_url['tid'][0]        //posted_url(字典類型)      //將字典第一個元素取出

  userlist = get_post_userlist(soup)                // 調用get_post_userlist方法 - 獲取發帖用戶信息
  contentlist = get_contentlist(soup)               // 調用get_conentlist方法,獲得內容的信息

  for i in range(len(contentlist)):
    contentlist[i]['user_list'] = userlist[i]              // 將userlist中的信息 添加進contentlist中

  post_content_info = {
    'title':title,
    'url':url,
    'tid':tid,
    'author':userlist[0],
    'content':contentlist[0]['content'],
    'comment':contentlist[1:]
  }

  return post_content_info

 

def get_post_userlist(post_soup_object):
  user_info_doms = post_soup_object.select(".authi")
  # 選擇器,可以獲得多條也可以獲得單條數據

  

  user_list = []
  # 定義一個用戶空列表
  for i in range(len(user_info_doms)):
    if i%2 == 0:      // 第二條數據無用
    user_name = user_info_doms[i].a.string    //選擇將a標簽里的字段取出
  # 將下角標為i的數據轉換成string類型
  uid = parse_qs(user_info_doms[i].a['href'])['uid'][0]     //獲取鏈接中的uid
  user_list.append({"user_name":user_name,"uid":uid})
  # 向列表中添加元素
  return user_list        //返回一個列表
  # 返回發帖者的數組

 

def get_contentlist(Soup):
  object = Soup.select('.t_f')

  content_list = []
  for i in range(len(object)):
    content = object[i].string 
  postmessage = object[i]['id']
  tid = postmessage.split("_")[1]         //split 以'_'分割 取之后的第一個元素
  content_list.append({"tid":tid,"content":content})
  return content_list

 

//將爬取的數據寫入txt文件

//這樣導出的格式可以直接導入進數據庫中

def writeTofile(content):
  with open("test4.text",'a',encoding='utf-8') as f:
  f.write(content['url']+'\t')         '\t 后面追加一個tab空格'
  f.write(content['tid']+'\t')
  f.write(content['author']['user_name']+'\t')
  f.write(content['author']['uid']+'\t')
  f.write(json.dumps(content['comment'],ensure_ascii=False)+'\t')
  f.write('{0:<30}'.format(content['title']).split("-")[0] +'\t')
  f.write('\n')
  f.close()

 

url = 'http://www.9yfeng.com/forum.php?mod=viewthread&tid='
for i in range(1,1000):
content = get_Web_content(url+str(i))
if(content!=False):
web_info = get_Web_Info(content)
writeTofile(web_info)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM