1. 程式人生 > >python定向爬蟲——爬取某代理Ip網站上的所有ip

python定向爬蟲——爬取某代理Ip網站上的所有ip

爬取一個網站的基本過程

  • 確定目標 –> 分析目標 –> 編寫程式 -> 執行爬蟲
  • 分析目標:
    url 格式 資料格式 網頁編碼

    分析目標資料在原始碼裡的結構,以便在獲取整個頁面原始碼後,可以利用正則進行匹配。

注意:目標網站的格式會隨時升級,定向爬蟲也需要定期升級。

例項:爬取某代理Ip網站上的所有ip

確定目標:

  • 爬取西刺代理上存活一年以上的高匿代理IP

網站

分析目標

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

根據上面分析可以確定兩個正則表示式

  • 獲取目標資料:
re.compile(r'(\d+\.\d+\.\d+\.\d+).*?<td>(\d{2,4})</td>.*?<td>(\d+.*?)</td>'
,re.M|re.S)
  • 獲取新的url:
re.compile(r'<a.*?href="(/nn/\d+)">\d{1,4}</a>',re.M|re.S)

編寫程式

  • 如果你得程式設計能力很強,那麼倒是可以直接入手編寫程式。但是作為我還差的遠,所以在編寫程式之前就把程式碼架構在腦海中過一遍,畫一個流程圖。以便編寫程式時有一個清楚的思路。同時這也是一個很好的習慣。
  • 程式碼結構:
HttpMain.py    ---主檔案
     class Htma()        
         def beganCrawl()      主程式    
     if
__name__ == '__main__': 程式執行入口 HttpSourceCode.py ---獲取原始碼檔案 class Souco() def sent() 請求連線函式 HttpAnalyze.py ---分析原始碼檔案 class Anurl() def getInfor() 分析獲取url和目標資料 HttpHandleUrl.py ---處理新的url檔案 class Hanur() def takeOutUrl() 獲取url方法 def
gainUrls() 儲存url方法 HttpSaveFile.py ---儲存資料檔案 class Safi() def dataNotNone() 儲存一個網頁上的目標資料 def outputer() 把全部目標資料寫入檔案

這裡寫圖片描述

  • 程式

HttpMain.py —主檔案—主檔案

#!/usr/bin/env python
# encoding: utf-8
'''
writer:lxshen
date:2017-8-13
E-mail:[email protected]
'''
from reprile_IP import HttpSourceCode,HttpHandleUrl,HttpAnalyze,HttpSaveFile

class Htma(object):
    def __init__(self):
        self.sourceCode = HttpSourceCode.Souco()  #下載原始碼
        self.analyze = HttpAnalyze.Anurl()  # 分析原始碼
        self.handleUrl = HttpHandleUrl.Hanur()   #處理新的url
        self.saveFile = HttpSaveFile.Safi()      #儲存資訊到檔案

    def beganCrawl(self,new_url):
        count = 1
        #把主url新增到new_url中去
        self.handleUrl.addNewUrl(new_url)

        #判斷 new_url_lsit 列表中是否存還存在url
        while self.handleUrl.new_url_list:

            #從new_url_lsit列表中獲取一個url
            new_url = self.handleUrl.takeOutUrl()
            print u'開始爬取第%d個:%s' %(count,new_url)

            #把這個url傳入到獲取請求函式中,並把原始碼返回
            html_code = self.sourceCode.sent(new_url)

            #把原始碼傳入分析原始碼函式中,並把返回新獲取的url和主要資訊
            new_urls,new_data = self.analyze.getInfor(html_code)
            # print new_data
            # print new_urls
            #把new_urls列表新增到 new_url_lsit 中去
            #把new_date列表傳入到寫入檔案函式中
            self.handleUrl.gainUrls(new_urls)
            self.saveFile.dateNotNone(new_data)

            if count == 20:break
            count += 1
        self.saveFile.outputer()

if __name__ == '__main__':
    rootUrl = 'http://www.xicidaili.com/nn/1'
    hm = Htma()
    hm.beganCrawl(rootUrl)

HttpSourceCode.py —獲取原始碼檔案

#!/usr/bin/env python
# encoding: utf-8
'''
writer:lxshen
date:2017-8-13
E-mail:[email protected]
'''
import urllib2

class Souco(object):
    def sent(self, new_url):
        if new_url is None:
            return None
        #獲取一個User-Agent
        headers = {
                'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) '
             'Gecko/20100101 Firefox/54.0',
        }

        #獲取request請求物件
        request = urllib2.Request(new_url,headers = headers)
        try:
            # 建立物件
            response = urllib2.urlopen(request)
            if response.getcode() !=200:
                return None
            return response.read()
        except:
            print u'獲取網站原始碼失敗'

HttpAnalyze.py —分析原始碼檔案

#!/usr/bin/env python
# encoding: utf-8
'''
writer:lxshen
date:2017-8-13
E-mail:[email protected]
'''

import re,urllib2
from reprile_IP import HttpSourceCode

class Anurl(object):
    def getInfor(self, html_code):
        try:
            findInforList = self.getInforCompile().findall(html_code)
            inforList = self.filtrationInfor(findInforList)

            findUrlList = self.getUrlCompile().findall(html_code)
            urlList = self.filtrationUrl(findUrlList)
            return urlList, inforList
        except:
            print u'從原始碼中匹配資訊失敗'

    def getInforCompile(self):
        inforCom = re.compile(r'(\d+\.\d+\.\d+\.\d+).*?<td>(\d{2,4})</td>.*?<td>(\d+.*?)</td>',re.M|re.S)
        return inforCom

    def getUrlCompile(self):
        urlCom = re.compile(r'<a.*?href="(/nn/\d+)">\d{1,4}</a>',re.M|re.S)
        return urlCom

    def filtrationInfor(self, findInforList):
        ipList = []
        for i in findInforList:
            if '天' in i[2]:
                if int(re.search('\d+',i[2]).group()) > 365:
                    ipList.append(i)
        return ipList

    def filtrationUrl(self, findUrlList):
        urlList = []
        string = 'http://www.xicidaili.com'
        for url in findUrlList:
            urlList.append(string+url)
        return urlList

HttpHandleUrl.py —處理新的url檔案

#!/usr/bin/env python
# encoding: utf-8
'''
writer:lxshen
date:2017-8-13
E-mail:[email protected]
'''

import random

class Hanur(object):
    def __init__(self):
        self.new_url_list = list()
        self.old_url_list = list()

    def addNewUrl(self,new_url):
        if new_url is None:return

        if new_url in self.new_url_list or new_url in self.old_url_list:return
        self.addNewurls(new_url)

    def addNewurls(self, new_url):
        #把這個新的url新增到url列表中
        self.new_url_list.append(new_url)

    def takeOutUrl(self):
        #獲取一個url
        if self.new_url_list is not None:
            try:
                new_url = random.choice(self.new_url_list)
                self.new_url_list.remove(new_url)
                self.old_url_list.append(new_url)
            except:
                print u'獲取新的url失敗'
            else:
                return new_url

    def gainUrls(self, new_urls):
        try:
            for url in new_urls:
                self.addNewUrl(url)
        except:
            print u'新增新的url失敗'

HttpSaveFile.py —儲存資料檔案

#!/usr/bin/env python
# encoding: utf-8
'''
writer:lxshen
date:2017-8-13
E-mail:[email protected]
'''


class Safi(object):
    def __init__(self):
        self.datas = list()

    def dateNotNone(self, new_data):
        try:
            for data in new_data:
                if data is None:return
                self.datas.append(data)
        except:
            print u'新增有用資訊到列表失敗'

    def outputer(self):
        with open('ip.txt','w+') as f:
            for data in self.datas:
                f.write('%3s:%s' % (data[0],data[1]))
                f.write('%20s' % data[2])
                f.write('\n')

執行程式

這裡寫圖片描述

這裡寫圖片描述

執行非常完美。

總結

在編寫這個程式時,遇到最大的問題就是用正則表示式匹配網站上的資訊。不得已又把正則過了一遍。又瞭解到了flag引數(I,M…),總之滿滿的收穫。

相關推薦

python定向爬蟲——代理Ip網站所有ip

爬取一個網站的基本過程 確定目標 –> 分析目標 –> 編寫程式 -> 執行爬蟲 分析目標: url 格式 資料格式 網頁編碼 分析目標資料在原始碼裡的結構,以便在獲取整個頁面原始碼後,可以利用正則進行匹配。

python3多執行緒爬蟲美女圖片網站的指定頁圖片資源,你懂的

Queue(佇列物件) queue是python3中的標準庫,可以直接import queue引用;佇列是執行緒間最常用的交換資料的形式。 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,都是not

PHP簡單爬蟲 免費代理ip 一萬條

img mys i++ .com log mage top100 dai code 目標站:http://www.xicidaili.com/ 代碼: <?php require ‘lib/phpQuery.php‘; require ‘lib/QueryList.

python 爬蟲網站的漫畫

文章目錄 宣告 前言 思路 流程 程式 結果 宣告 為了表示對網站的尊重,已將網站地址隱藏,下載的漫畫之前我就看過了,所以也會刪掉,絕不侵犯網站的利益。 前言

Python簡易爬蟲百度貼吧圖片

decode works 接口 def 讀取 min baidu 得到 internal       通過python 來實現這樣一個簡單的爬蟲功能,把我們想要的圖片爬取到本地。(Python版本為3.6.0) 一.獲取整個頁面數據    def getHtml(url)

python 爬蟲 證券之星網站

爬蟲 周末無聊,找點樂子。。。#coding:utf-8 import requests from bs4 import BeautifulSoup import random import time #抓取所需內容 user_agent = ["Mozilla/5.0 (Windows NT 10.0

python爬蟲資料的處理之Json字串的處理(2)

#Json字串的處理 Json字串轉化為Python資料型別 import json JsonStr ='{"name":"sunck","age":"18","hobby":["money","power","English"],"parames":{"a":1,"b":2}}' Js

python網路爬蟲汽車之家的最新資訊和照片

實現的功能是爬取汽車之家的最新資訊的連結 題目和文章中的照片 爬蟲需要用到我們使用了 requests 做網路請求,拿到網頁資料再用 BeautifulSoup 進行解析 首先先檢查是否安裝了pip,如果已經安裝了pip,直接pip install requests,pip uninstal

學會用python網路爬蟲鬥圖網的表情包,聊微信再也不怕鬥圖了

最近總是有人跟我鬥圖,想了想17年中旬時在網上看過一篇關於爬取鬥圖網表情包的py程式碼,但是剛想爬的時候發現網頁結構發生了變化,而且鬥圖網還插入了很多廣告,變化其實挺大的,所以臨時寫了一個爬蟲,簡單的爬取了鬥圖網的表情包。從這連結上看,page表示的是第幾頁,我

Python開發爬蟲百度百科詞條資訊(原始碼下載)

下面使用Python開發一個網頁爬蟲,爬取百度百科詞條資訊,整個程式涉及到url管理器,html下載器,html解析器,html顯示以及排程程式: 程式結構: spider_main.py:爬蟲的排

python網路爬蟲房價資訊

爬取房天下(http://newhouse.cd.fang.com/house/s/)成都地區的新房資訊。開啟http://newhouse.cd.fang.com/house/s/,F12進入控制檯點選控制檯的左上角的按鈕,這是你可以將滑鼠移至房天下頁面的任何一個地方然後單

php利用curl爬蟲微信公眾號,防止ip封鎖

前段時間遇到一個需求,是定向抓取一批微信公眾號,於是找到了搜狗搜尋引擎比較好,下面貼出原始碼,各位可以試下 public function test(){ //搜狗抓取微信公眾號 $url="http://weixin.sogou.com/weixin?type=1&

python爬蟲網頁的圖片,基礎改善版

突然發現樣式太坑,還要爬取在css裡面,寫了個基礎的,解決下朋友的問題 import string import urllib.request import re import os import urllib # 根據給定的網址來獲取網頁詳細資訊,得到的

python 3.5:爬蟲--人民日報1946-2003年所有新聞

爬取資料庫網站上的人民日報新聞(1946-2003) 總網址如下: http://www.ziliaoku.org/rmrb?from=groupmessage&isappinstalled=0 從此網頁開始爬取,進下一層,再進入下一層,再進行爬取。 由於本人還在學

python-關於爬蟲貼吧圖片

#利用xpath解析列表資料 from lxml import etree import requests import os # 需求:爬取百度貼吧圖片,翻頁,下載圖片儲存到本地 # 流程: # 1、構建url和headers # 2、傳送請求、獲取響應 # 3、解析列表

Python簡單爬蟲多頁圖片

初學爬蟲簡單的爬了爬貼吧圖片 #!/usr/bin/python # coding utf-8 import re import time import urllib def getHtml():

Node.js:request+cheerio爬蟲免費代理

背景 在極客學院的微信公眾號上看到了一個Node.js寫爬蟲的入門教程——用nodejs去爬一下A站老司機的文章,感覺挺有意思,於是動手寫一下。 依賴庫 request:發請求,下載網頁用的,類似於python的urllib2 cheerio:解

python爬蟲一張圖片

dsl com request http des get resp con quest 代碼: import requestsresponse = requests.get(‘https://s1.hdslb.com/bfs/static/jinkela/video/ass

python爬蟲美麗小姐姐圖片美女桌布

爬蟲爬取蜂鳥裡的高清桌布   想要自動下載某個網站的高清桌布,不能一個個點選下載,所以用爬蟲實現自動下載。改程式碼只針對特定網站,不同網站需要特別分析。 一、分析網站   https://photo.fengniao.com/     隨便點選一張,發現可以上一頁,下一頁的翻頁

python3爬蟲-新浪新聞首頁所有新聞標題

準備工作:安裝requests和BeautifulSoup4。開啟cmd,輸入如下命令 pip install requests pip install BeautifulSoup4 按F12開啟開發人員工具,點選左上角的圖片,然後再頁面中點選你想檢