第二篇 - 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

posted @ 2018-08-14 00:42  o云淡风轻o  阅读(1172)  评论(0编辑  收藏  举报