<noframes id="7xbfr"><pre id="7xbfr"><output id="7xbfr"></output></pre>

      <big id="7xbfr"><font id="7xbfr"><listing id="7xbfr"></listing></font></big>
        <p id="7xbfr"></p>
        <menuitem id="7xbfr"></menuitem>

          <video id="7xbfr"><mark id="7xbfr"><listing id="7xbfr"></listing></mark></video>
            <form id="7xbfr"></form>

          <delect id="7xbfr"><var id="7xbfr"></var></delect>

          Python爬蟲抓取網頁函數式編程

          時間:2022-02-13 11:52:11 類型:python
          字號:    

          Python 函數式編程可以讓程序的思路更加清晰、易懂

          定義相應的函數,通過調用函數來執行爬蟲程序

          from urllib import request
          from urllib import parse
          
          # 拼接URL地址
          def get_url(word):
          url = 'http://www.baidu.com/s?{}'
          #此處使用urlencode()進行編碼
          params = parse.urlencode({'wd':word})
          url = url.format(params)
          return url
          
          # 發請求,保存本地文件
          def request_url(url,filename):
          headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
          # 請求對象 + 響應對象 + 提取內容
          req = request.Request(url=url,headers=headers)
          res = request.urlopen(req)
          html = res.read().decode('utf-8')
          # 保存文件至本地
            with open(filename,'w',encoding='utf-8') as f:
              f.write(html)
          
          # 主程序入口
          if __name__ == '__main__':
          word = input('請輸入搜索內容:')
          url = get_url(word)
          filename = word + '.html'
          request_url(url,filename)

          下面以類的形式編寫爬蟲程序,并在類下編寫不同的功能函數,代碼如下所示:

          from urllib import request,parse
          import time
          import random
          from ua_info import ua_list #使用自定義的ua池
          
          #定義一個爬蟲類
          class TiebaSpider(object):
          #初始化url屬性
          def __init__(self):
          self.url='http://tieba.baidu.com/f?{}'
          
          # 1.請求函數,得到頁面,傳統三步
          def get_html(self,url):
          req=request.Request(url=url,headers={'User-Agent':random.choice(ua_list)})
          res=request.urlopen(req)
          #windows會存在亂碼問題,需要使用 gbk解碼,并使用ignore忽略不能處理的字節
          #linux不會存在上述問題,可以直接使用decode('utf-8')解碼
          html=res.read().decode("gbk","ignore")
          return html
          # 2.解析函數,此處代碼暫時省略,還沒介紹解析模塊
          def parse_html(self):
          pass
          # 3.保存文件函數
          def save_html(self,filename,html):
          with open(filename,'w') as f:
          f.write(html)
          # 4.入口函數
          def run(self):
          name=input('輸入貼吧名:')
          begin=int(input('輸入起始頁:'))
          stop=int(input('輸入終止頁:'))
          # +1 操作保證能夠取到整數
          for page in range(begin,stop+1):
          pn=(page-1)*50
          params={
          'kw':name,
          'pn':str(pn)
          }
          #拼接URL地址   
          params=parse.urlencode(params)
          url=self.url.format(params)
          #發請求
          html=self.get_html(url)
          #定義路徑
          filename='{}-{}頁.html'.format(name,page)
          self.save_html(filename,html)
          #提示
          print('第%d頁抓取成功'%page)
          #每爬取一個頁面隨機休眠1-2秒鐘的時間
          time.sleep(random.randint(1,2))
          #以腳本的形式啟動爬蟲
          if __name__=='__main__':
          start=time.time()
          spider=TiebaSpider() #實例化一個對象spider
          spider.run() #調用入口函數
          end=time.time()
          #查看程序執行時間
          print('執行時間:%.2f'%(end-start))  #爬蟲執行時間

          以面向對象方法編寫爬蟲程序時,思路簡單、邏輯清楚,非常容易理解,上述代碼主要包含了四個功能函數,它們分別負責了不同的功能,總結如下:

          1) 請求函數

          請求函數最終的結果是返回一個 HTML 對象,以方便后續的函數調用它。 

          2) 解析函數

          解析函數用來解析 HTML 頁面,常用的解析模塊有正則解析模塊、bs4 解析模塊。通過分析頁面,提取出所需的數據,在后續內容會做詳細介紹。

          3) 保存數據函數

          該函數負責將抓取下來的數據保至數據庫中,比如 MySQL、MongoDB 等,或者將其保存為文件格式,比如 csv、txt、excel 等。

          4) 入口函數

          入口函數充當整個爬蟲程序的橋梁,通過調用不同的功能函數,實現數據的最終抓取。入口函數的主要任務是組織數據,比如要搜索的貼吧名、編碼 url 參數、拼接 url 地址、定義文件保存路徑。

          爬蟲程序結構

          用面向對象的方法編寫爬蟲程序時,邏輯結構較為固定,總結如下:

          # 程序結構
          class xxxSpider(object):
          def __init__(self):
          # 定義常用變量,比如url或計數變量等
          
          def get_html(self):
          # 獲取響應內容函數,使用隨機User-Agent
          
          def parse_html(self):
          # 使用正則表達式來解析頁面,提取數據
          
          def write_html(self):
          # 將提取的數據按要求保存,csv、MySQL數據庫等
          
          def run(self):
          # 主函數,用來控制整體邏輯
          
          if __name__ == '__main__':
          # 程序開始運行時間
          spider = xxxSpider()
          spider.run()

          爬蟲程序隨機休眠

          在入口函數代碼中,包含了以下代碼:

          #每爬取一個頁面隨機休眠1-2秒鐘的時間
          time.sleep(random.randint(1,2))

          爬蟲程序訪問網站會非???,這與正常人類的點擊行為非常不符。因此,通過隨機休眠可以使爬蟲程序模仿成人類的樣子點擊網站,從而讓網站不易察覺是爬蟲訪問網站,但這樣做的代價就是影響程序的執行效率

          黄网站免费 <