第二篇 - python爬取免費代理


代理的作用參考https://wenda.so.com/q/1361531401066511?src=140

免費代理很多,但也有很多不可用,所以我們可以用程序對其進行篩選。以能否訪問百度為例。

1.獲取網頁內容。

import requests
url = "http://www.xicidaili.com/"
#獲取網頁源代碼
def getData(url):
    r = requests.get(url)
    content = r.text
    return content
getData(url)

對於一般網站像這樣獲取源代碼就可以了,不過,這個網站有反爬機制,所以得用如下代碼。

import requests
url = "http://www.xicidaili.com/"
#獲取網頁源代碼
def getData(url):
    header = {
        'User-Agent': '',
        'Accept': '',
        'Accept-Encoding': '',
        'Accept-Language': ''
    }
    session1 = requests.Session() session1.headers.update(header)
    r = session1.get(url)
    content = r.text
    return content
getData(url)

 header里面的內容可以自己用瀏覽器訪問網站,審查元素,network,F5刷新看到,然后填入相應位置。

2.獲取免費代理ip和端口號。

import requests
import re
url = "http://www.xicidaili.com/"
#獲取網頁源代碼
def getData(url):
    header = {
        'User-Agent': '',
        'Accept': '',
        'Accept-Encoding': '',
        'Accept-Language': ''
    }
    session1 = requests.Session()
    session1.headers.update(header)
    r = session1.get(url)
    content = r.text
    return content
#獲取免費IP和端口號
def getIp(content):
    #ip格式為192.168.1.1,端口號為2或4為數字,與源代碼進行匹配,取出ip和端口號
    ip_port_tmp = "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)</td>[\n|\s]*<td>(\d{2,4})"
    ip_port = re.findall(ip_port_tmp,content)
    return ip_port
content = getData(url)
ip_port = getIp(content)
print(ip_port)

 3.檢驗這些代理ip是否可以訪問百度

import requests
import re
#獲取網頁源代碼
def getData(url):
    header = {
        'User-Agent': '',
        'Accept': '',
        'Accept-Encoding': '',
        'Accept-Language': ''
    }
    session1 = requests.Session()
    session1.headers.update(header)
    r = session1.get(url)
    content = r.text
    return content
#獲取免費IP和端口號
def getIp(content):
    #ip格式為192.168.1.1,端口號為2或4為數字,與源代碼進行匹配,取出ip和端口號
    ip_port_tmp = "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)</td>[\n|\s]*<td>(\d{2,4})"
    ip_port = re.findall(ip_port_tmp,content)
    return ip_port
def check_ip(ip_port):
    url_baidu = "http://www.baidu.com/"
    status = False
    proxies = {
        "http": f"{ip_port[0]}:{ip_port[1]}",
        "https": f"{ip_port[0]}:{ip_port[1]}"
    }
    try:
        r_baidu = requests.get(url_baidu, timeout=3, proxies=proxies)
        L.append(proxies)
        status = True
    except Exception as e:
        print(e)
        pass
    return status
if __name__ == '__main__':
    url = "http://www.xicidaili.com/"#爬取免費ip
    L = []#存儲可用ip
    content = getData(url)#獲取網頁源代碼
    ip_port = getIp(content)#獲取免費ip
    for item in ip_port:
        check_ip(item)#得到可用的免費ip並存儲到列表L中
    print(L)

4.將L里面的Ip保存到txt文件中

with open('ip1.txt','w') as f:
    for l in L:
        f.write(l['http'])
        f.write("\n")

補充:第三步檢查速度有點慢,可以使用多線程進行優化。

import requests
import re
from multiprocessing.dummy import Pool as ThreadPool
#獲取網頁源代碼
def getData(url):
    header = {
        'User-Agent': '',
        'Accept': '',
        'Accept-Encoding': '',
        'Accept-Language': ''
    }
    session1 = requests.Session()
    session1.headers.update(header)
    r = session1.get(url)
    content = r.text
    return content
#獲取免費IP和端口號
def getIp(content):
    #ip格式為192.168.1.1,端口號為2或4為數字,與源代碼進行匹配,取出ip和端口號
    ip_port_tmp = "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)</td>[\n|\s]*<td>(\d{2,4})"
    ip_port = re.findall(ip_port_tmp,content)
    return ip_port
def check_ip(ip_port):
    url_baidu = "http://www.baidu.com/"
    status = False
    proxies = {
        "http": f"{ip_port[0]}:{ip_port[1]}",
        "https": f"{ip_port[0]}:{ip_port[1]}"
    }
    try:
        r_baidu = requests.get(url_baidu, timeout=3, proxies=proxies)
        L.append(proxies)
        status = True
    except Exception as e:
        # print(e)
        pass
    return status
if __name__ == '__main__':
    url = "http://www.xicidaili.com/"#爬取免費ip
    L = []#存儲可用ip
    content = getData(url)#獲取網頁源代碼
    ip_port = getIp(content)#獲取免費ip
    # for item in ip_port:
    #     check_ip(item)#得到可用的免費ip並存儲到列表L中
    pool = ThreadPool(30)
    pool.map(check_ip, ip_port)
    pool.close()
    pool.join()
    print(L)

此時已經抓取到了可用的免費ip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM