代理的作用参考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