TShopping

 找回密碼
 註冊
搜索
查看: 898|回復: 0
打印 上一主題 下一主題

[教學] Python 爬蟲模塊bs4 實戰一:獲取百度貼吧內容

[複製鏈接]
跳轉到指定樓層
1#
發表於 2022-5-23 23:17:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
getCommentInfo.py:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from mylog import MyLog as mylog

  4. class Item(object):
  5.     title = None
  6.     fristAuthor = None
  7.     fristTime = None
  8.     reNum = None
  9.     content = None
  10.     lastAuthor = None
  11.     lastTime = None

  12. class GetTiebaInfo(object):
  13.     def __init__(self, url):
  14.         self.url = url
  15.         self.log = mylog()
  16.         self.pageSum = 5
  17.         self.urls = self.getUrls(self.pageSum)
  18.         self.items = self.spider(self.urls)
  19.         self.pipelines(self.items)

  20.     def getUrls(self,pageSum):
  21.         urls = []
  22.         pns = [str(i*50) for i in range(pageSum)]
  23.         ul = self.url.split('=')
  24.         for pn in pns:
  25.             ul[-1] = pn
  26.             url = '='.join(ul)
  27.             urls.append(url)
  28.         self.log.info(u'取得URLS成功')
  29.         return urls

  30.     def spider(self, urls):
  31.         items = []
  32.         for url in urls:
  33.             htmlContent = self.getResponseContent(url)
  34.             soup = BeautifulSoup(htmlContent, 'lxml')
  35.             tagsli = soup.find_all('li',attrs={'class':'j_thread_list clearfix'})
  36.             for tag in tagsli:
  37.                 item = Item()
  38.                 item.title = tag.find('a',attrs={'class':'j_th_tit'}).get_text().strip()
  39.                 item.fristAuthor = tag.find('span',attrs={'class':'frs-author-name-warp'}).a.get_text().strip()
  40.                 item.fristTime = tag.find('span', attrs={'title': u'建立時間'.encode('utf8')}).get_text().strip()
  41.                 item.reNum = tag.find('span', attrs={'title': u'回覆'.encode('utf8')}).get_text().strip()
  42.                 item.content = tag.find('div', attrs={'class': 'threadlist_abs_onlyline '}).get_text().strip()
  43.                 item.lastAuthor = tag.find('span', attrs={'class': 'tb_icon_author_rely j_replayer'}).get_text().strip()
  44.                 item.lastTime = tag.find('span', attrs={'title': u'最後回覆時間'.encode('utf8')}).get_text().strip()
  45.                 items.append(item)
  46.                 self.log.info(u'取得標題為<<%s>>的項成功 ...' %item.title)
  47.         return items

  48.     def pipelines(self, items):
  49.         fileName = u'擺渡貼吧_權力的遊戲.txt'
  50.         with open(fileName, 'w', encoding='utf-8') as fp:
  51.             for item in items:
  52.                 fp.write('title:%s \t author:%s \t firstTime:%s \n content:%s \n return:%s \n lastAuthor:%s \t lastTime:%s \n\n\n\n'
  53.                          %(item.title.encode('utf8'),item.fristAuthor.encode('utf8'),item.fristTime.encode('utf8'),item.content.encode('utf8')
  54.                            ,item.reNum.encode('utf8'),item.lastAuthor.encode('utf8'),item.lastTime.encode('utf8')))
  55.                 self.log.info(u'標題為<<%s>>的項輸入到"%s成功"'
  56.                               %(item.title, fileName.decode('utf8')))

  57.     def getResponseContent(self, url):
  58.         try:
  59.             response = requests.get(url)
  60.         except:
  61.             self.log.error(u'Python 返回 URL:%s 資料失敗 ' %url)
  62.         else:
  63.             self.log.info(u'Python 返回 URL:%s 資料成功 ' %url)
  64.             return response.text

  65. if __name__ == '__main__':
  66.     url = u'http://tieba.baidu.com/f?kw=權力的遊戲&ie=utf-8&pn=50'
  67.     GTI = GetTiebaInfo(url)
複製代碼
mylog.py
  1. import logging
  2. import getpass
  3. import sys

  4. class MyLog(object):
  5.     def __init__(self):
  6.         self.user = getpass.getuser()
  7.         self.logger = logging.getLogger(self.user)
  8.         self.logger.setLevel(logging.DEBUG)
  9.         ### 日誌檔名
  10.         self.logFile = sys.argv[0][0:-3]+'.log'
  11.         self.formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s\r\n')
  12.         ### 日誌顯示到銀幕上並輸出到日誌檔內
  13.         self.logHand = logging.FileHandler(self.logFile, encoding='utf8')
  14.         self.logHand.setFormatter(self.formatter)
  15.         self.logHand.setLevel(logging.DEBUG)

  16.         self.logHandSt = logging.StreamHandler()
  17.         self.logHandSt.setFormatter(self.formatter)
  18.         self.logHandSt.setLevel(logging.DEBUG)

  19.         self.logger.addHandler(self.logHand)
  20.         self.logger.addHandler(self.logHandSt)

  21.     ### 日誌的 5 個級別對應以下的5個函數
  22.     def debug(self,msg):
  23.         self.logger.debug(msg)
  24.     def info(self,msg):
  25.         self.logger.info(msg)
  26.     def warning(self,msg):
  27.         self.logger.warning(msg)
  28.     def error(self,msg):
  29.         self.logger.error(msg)
  30.     def critical(self,msg):
  31.         self.logger.critical(msg)

  32. if __name__ == '__main__':
  33.     mylog = MyLog()
  34.     mylog.debug(u"I'm debug 測試中文")
  35.     mylog.info("I'm info")
  36.     mylog.warning("I'm warning")
  37.     mylog.error(u"I'm error 測試中文")
  38.     mylog.critical("I'm critical")
複製代碼
參考文章
https://codeleading.com/article/55914188948/

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-20 11:41 , Processed in 0.047504 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表