1. 程式人生 > >Python3爬蟲(1)小試牛刀

Python3爬蟲(1)小試牛刀

最近學習了python3的爬蟲機制!也就是通過使用urllib模組傳送http請求來獲取網頁的html原始碼,然後使用正則匹配出自己想要收集的資訊!(注意python2中所用的模組不一樣)

下面小試牛刀,做了一個例子!附上需求和原始碼!

需求:分頁爬取網頁上的ip地址資訊


儲存形式:(將從網頁上獲取到的資訊分行寫入.txt檔案中)


程式碼邏輯

#引入urllib模組,用於發起http請求
from urllib import request
#引入re模組,用於正則匹配
import re
#建立一個檔案物件(w+追加寫入模式)
file = open('ips.txt', 'w+', encoding='utf-8')

def get_html_66ip():
    #通過定義headers中的User-Agent偽裝成一個browser,如果不定義headers,User-Agent會被預設解析成python3 urllib
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
    }
    # 66代理,全國代理ip(2018年驗證ip,前89頁)
    for page_num in range(1,90):
        target = 'http://www.66ip.cn/{}'.format(page_num)
        r_obj = request.Request(url=target,headers=headers)
        response = request.urlopen(r_obj)
        html = response.read().decode('gbk')
        # print(html)

        pat_html = re.compile(r'<tr><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td></tr>',re.S)

        #這裡注意使用findall取出的資料res是一個列表,列表的每個元素是元組,即[('xxx','xxxx'),('xxxx','xxxxx')]
        res = pat_html.findall(html)

        #判斷匹配出的資訊,第一行表頭不要
        ips = []
        for k,v in enumerate(res):
            if k != 0:
                ips.append(v)
        #將元組轉成str,去除首尾的'('和')'寫入檔案
        for v in ips:
            file.write(str(v).lstrip('(').rstrip(')') + '\n')

#程序啟動宣告(程式從這裡開始執行)
if __name__ == '__main__':
    #呼叫爬取def
    get_html_66ip()
    #關閉檔案物件
    file.close()