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