1. 程式人生 > >Python爬蟲教程:爬取百度貼吧

Python爬蟲教程:爬取百度貼吧

貼吧爬取

寫程式碼前,構思需要的功能塊;寫程式碼時,把各個功能模組名提前寫好

初始化

初始化必要引數,完成基礎設定 爬取百度貼吧lol吧:爬取地址中的get引數須傳遞(可以指定不同主題的貼吧和頁碼)

  • 主題名
  • 初始網址
  • 請求頭

生成網址

生成每一頁的路由地址

  • 根據列表生成式生成多個頁面的地址

下載

get請求給每一頁的地址,爬取頁面

儲存

儲存爬取結果到檔案中,把每一頁爬取結果寫入到對應名字的檔案中

控制流程

將以上爬取操作封裝到run函式中,方便外部物件呼叫,以後會在此新增多執行緒

  • 生成要爬取的每一頁的路由地址
  • 通過for迴圈遍歷每一個路由地址
  • 對每個路由地址進行爬取和獲取頁碼操作,並進行儲存

原始碼

import requests

'''
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875,反正閒著也是閒著呢,不如學點東西啦~~
'''

class TiebaSpider:
    def __init__(self, tieba_name_crawl):
        """
        初始化必要引數,完成基礎設定
        爬取百度貼吧lol吧:爬取地址中的get引數須傳遞(可以指定不同主題的貼吧和頁碼)
        """
        self.tieba_name = tieba_name_crawl
        self.url_base = 'https://tieba.baidu.com/f?kw=' + tieba_name_crawl + '&ie=utf-8&pn={}'
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'}

    def make_url(self):
        """
        生成每一頁的路由地址
        :return:(列表生成式)
        """
        return [self.url_base.format(i) for i in range(4)]

    def download_url(self, url_str):
        """
        get請求給每一頁的地址,爬取頁面
        :param url_str: 每一頁的路由地址
        :return: 爬取的結果
        """
        result = requests.get(url_str, headers=self.headers)
        return result.text

    def save_result(self, result, page_num):
        """
        儲存爬取結果到檔案中
        :param result: 每一頁的爬取結果
        :param page_num: 頁碼,方便分類儲存
        :return: 把每一頁爬取結果寫入到對應名字的檔案中
        """
        # with open('./download/lol' + str(page_num) + '.html', 'ab') as f:
        #     f.write(result.encode('utf-8'))
        file_path = './download/{}~第{}頁.html'.format(self.tieba_name,page_num)
        with open(file_path,'wb') as f:
            f.write(result.encode('utf-8'))

    def run(self):
        """
        將以上爬取操作封裝到run函式中,方便外部物件呼叫,以後會在此新增多執行緒
        · 生成要爬取的每一頁的路由地址
        · 通過for迴圈遍歷每一個路由地址
        · 對每個路由地址進行爬取和獲取頁碼操作,並進行儲存
        :return:
        """
        url_lists = self.make_url()
        for url_str in url_lists:
            result_str = self.download_url(url_str)
            p_num = url_lists.index(url_str) + 1
            self.save_result(result=result_str,page_num=p_num)

if __name__ == '__main__':
    tieba_spider = TiebaSpider('lol')
    tieba_spider.run()