TShopping

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

[教學] Python爬蟲學習之使用BeautifulSoup庫爬取開獎網站信息-模塊化

[複製鏈接]
跳轉到指定樓層
1#
發表於 2022-5-24 22:44:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
實例需求:運用python語言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html這個開獎網站所有的信息,並且保存為txt文件和excel文件。
實例環境:python3.7
       BeautifulSoup庫、xlwt庫(需手動安裝)
       urllib庫、re庫(內置的python庫,無需手動安裝)
實例網站:
  第一步,點擊鏈接http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html進入網站,查看網站基本信息,注意一共要爬取118頁數據。
  
  第二步,查看網頁源代碼,熟悉網頁結構,標籤等信息。
  
實例思路: 
  一個爬蟲程序的結構:
   1、調度模塊(Scheduler):安排發起網絡請求的策略
   2、網絡模塊(network):發起網絡請求,並接受服務器返回
   3、爬蟲模塊(Spider):解析、爬取數據
   4、Item模塊:定義爬取的數據項
   5、Piplines模塊:對已經爬取的數據做後續處理(存入數據庫、存入文件系統、傳遞給流式處理框架,等等)
   下面的示例程序基本實現了上述幾個模板
實例代碼:
  getWinningNum.py
  1. from bs4 import BeautifulSoup
  2. import urllib.request
  3. from mylog import MyLog as mylog


  4. # 4、  Item模块  定义爬取的数据项
  5. class DoubleColorBallItem(object):
  6.     date = None
  7.     order = None
  8.     red1 = None
  9.     red2 = None
  10.     red3 = None
  11.     red4 = None
  12.     red5 = None
  13.     red6 = None
  14.     blue = None
  15.     money = None
  16.     firstPrize = None
  17.     secondPrize = None


  18. class GetDoubleColorBallNumber(object):
  19.     def __init__(self):
  20.         self.urls = []
  21.         self.log = mylog()
  22.         self.getUrls()
  23.         self.items = self.spider(self.urls)
  24.         self.pipelines(self.items)
  25.         #SavaBallDate(self.items)

  26.     # 获取 urls 的函数
  27.     def getUrls(self):
  28.         URL = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html'
  29.         htmlContent = self.getResponseContent(URL)
  30.         soup = BeautifulSoup(htmlContent, 'lxml')
  31.         tag = soup.find_all('p')[-1]
  32.         pages = tag.strong.get_text()
  33.         for i in range(1, int(pages) + 1):
  34.             url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_' + str(i) + '.html'
  35.             self.urls.append(url)
  36.         return self.urls

  37.     # 3、    网络模块(NETWORK)发起网络请求,并接受服务器返回
  38.     def getResponseContent(self, url):
  39.         try:
  40.             response = urllib.request.urlopen(url)
  41.         #except URLError as e:
  42.         except:
  43.             self.log.error(u'Python 返回 URL:%s 資料失敗 ' %url)
  44.         else:
  45.             self.log.info(u'Python 返回 URL:%s 資料成功 \r\n' %url)
  46.             return response.read().decode("utf-8")

  47.     # 3、    爬虫模块(Spider) 解析、爬取数据
  48.     def spider(self, urls):
  49.         items = []
  50.         for url in urls:
  51.             try:
  52.                 htmlContent = self.getResponseContent(url)
  53.                 soup = BeautifulSoup(htmlContent, 'lxml')
  54.                 tags = soup.find_all('tr', attrs={})
  55.                 for tag in tags:
  56.                     if tag.find('em'):
  57.                         item = DoubleColorBallItem()
  58.                         tagTd = tag.find_all('td')
  59.                         item.date = tagTd[0].get_text()
  60.                         item.order = tagTd[1].get_text()
  61.                         tagEm = tagTd[2].find_all('em')
  62.                         item.red1 = tagEm[0].get_text()
  63.                         item.red2 = tagEm[1].get_text()
  64.                         item.red3 = tagEm[2].get_text()
  65.                         item.red4 = tagEm[3].get_text()
  66.                         item.red5 = tagEm[4].get_text()
  67.                         item.red6 = tagEm[5].get_text()
  68.                         item.blue = tagEm[6].get_text()
  69.                         item.money = tagTd[3].find('strong').get_text()
  70.                         item.firstPrize = tagTd[4].find('strong').get_text()
  71.                         item.secondPrize = tagTd[5].find('strong').get_text()
  72.                         items.append(item)
  73.             except Exception as e:
  74.                 raise e
  75.                 # print(str(e))
  76.         return items

  77.     # Piplines模块:对已经爬取的数据做后续处理(存入数据库、存入文件系统、传递给流式处理框架,等等)
  78.     def pipelines(self, items):
  79.         fileName = u'双色球.txt'
  80.         with open(fileName, 'w') as fp:  # a 为追加   w 为覆盖若存在
  81.             for item in items:
  82.                 fp.write('%s %s \t %s %s %s %s %s %s  %s \t %s \t %s %s \n'
  83.                          % (item.date, item.order, item.red1, item.red2, item.red3, item.red4, item.red5, item.red6,
  84.                             item.blue, item.money, item.firstPrize, item.secondPrize))


  85. if __name__ == '__main__':
  86.     GDCBN = GetDoubleColorBallNumber()
複製代碼

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")
複製代碼

實例結果:
  數據量有點大,可能需要等一會兒,下面為程序運行結束後的文件夾。
  
  __pycache__文件夾為程序運行自動生成的文件夾,不用管。
  
  

參考文章https://www.programminghunter.com/article/6471482213/



 

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

本版積分規則



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

GMT+8, 2024-4-28 23:13 , Processed in 0.051212 second(s), 25 queries .

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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