python之爬快代理与自动登录抽屉网
1.自动抽屉网
注意class或id属性中可能会含有多个值并由空格隔开,此时要注意找到唯一的值,且只能有一个值。
# 匹配到登录,然后用户名,然后输入,然后匹配密码,然后输入,然后回车 from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver import time chrome=webdriver.Chrome(r'D:\360安全浏览器下载\chromedriver_win32\chromedriver') try: wait=WebDriverWait(chrome,30) chrome.get('https://dig.chouti.com/') search_button=wait.until(EC.presence_of_element_located((By.ID,"login_btn"))) # 匹配到登录选项 search_button.click() time.sleep(3) # class 中需要只写唯一属性 input_tag = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "login-phone"))) # 匹配到输入手机号 input_tag.send_keys('在此输入你的手机号') password_tag = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "pwd-password-input"))) password_tag.send_keys('在此输入你的密码') login_button = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "btn-large")))# 匹配到登陆按钮 login_button.click() time.sleep(20) finally: chrome.close()
2.爬西刺代理
''' 爬取西刺免费代理: 1.访问西刺免费代理页面 2.通过re模块解析并提取所有代理 3.通过ip测试网站对爬取的代理进行测试 4.若test_ip函数抛出异常代表代理作废,否则代理有效 5.利用有效的代理进行代理测试 <tr class="odd"> <td class="country"><img src="//fs.xicidaili.com/images/flag/cn.png" alt="Cn"></td> <td>112.85.131.99</td> <td>9999</td> <td> <a href="/2019-05-09/jiangsu">江苏南通</a> </td> <td class="country">高匿</td> <td>HTTPS</td> <td class="country"> <div title="0.144秒" class="bar"> <div class="bar_inner fast" style="width:88%"> </div> </div> </td> <td class="country"> <div title="0.028秒" class="bar"> <div class="bar_inner fast" style="width:97%"> </div> </div> </td> <td>6天</td> <td>19-05-16 11:20</td> </tr> re: <tr class="odd">(.*?)</td>.*?<td>(.*?)</td> ''' import requests import re import time HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } def get_index(url): time.sleep(1) response = requests.get(url, headers=HEADERS) return response def parse_index(text): ip_list = re.findall('<tr class="odd">.*?<td>(.*?)</td>.*?<td>(.*?)</td>', text, re.S) for ip_port in ip_list: ip = ':'.join(ip_port) yield ip def test_ip(ip): print('测试ip: %s' % ip) try: proxies = { 'https': ip } # ip测试网站 ip_url = 'https://www.ipip.net/' # 使用有效与无效的代理对ip测试站点进行访问,若返回的结果为200则代表当前测试ip正常 response = requests.get(ip_url, headers=HEADERS, proxies=proxies, timeout=1) if response.status_code == 200: return ip # 若ip代理无效则抛出异常 except Exception as e: print(e) # 使用代理爬取nba def spider_nba(good_ip): url = 'https://china.nba.com/' proxies = { 'https': good_ip } response = requests.get(url, headers=HEADERS, proxies=proxies) print(response.status_code) print(response.text) if __name__ == '__main__': base_url = 'https://www.xicidaili.com/nn/{}' for line in range(1, 3677): ip_url = base_url.format(line) response = get_index(ip_url) ip_list = parse_index(response.text) for ip in ip_list: # print(ip) good_ip = test_ip(ip) if good_ip: # 真是代理,开始测试 spider_nba(good_ip) 爬取西刺免费代理进行代理测试
3.爬快代理
注意这里出错的原因可能是请求url出错,首页的url与第一页url可能是不一样的
比如快代理的首页是:https://www.kuaidaili.com/free用此作为请求url会出错
第一页:https://www.kuaidaili.com/free/inha/1/用此作为请求url不会出错
''' 爬取西刺免费代理: 1.访问西刺免费代理页面 2.通过re模块解析并提取所有代理 3.通过ip测试网站对爬取的代理进行测试 4.若test_ip函数抛出异常代表代理作废,否则代理有效 5.利用有效的代理进行代理测试 <table class="table table-bordered table-striped"> <thead> <tr> <th>IP</th> <th>PORT</th> <th>匿名度</th> <th>类型</th> <th>位置</th> <th>响应速度</th> <th>最后验证时间</th> </tr> </thead> <tbody> <tr> <td data-title="IP">175.44.159.33</td> <td data-title="PORT">9000</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">中国 福建省 三明市 联通</td> <td data-title="响应速度">0.8秒</td> <td data-title="最后验证时间">2019-06-17 22:30:57</td> </tr> <tr> <td data-title="IP">60.13.42.178</td> <td data-title="PORT">9999</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">甘肃省平凉市 联通</td> <td data-title="响应速度">2秒</td> <td data-title="最后验证时间">2019-06-17 21:30:59</td> </tr> <tr> <td data-title="IP">180.118.247.195</td> <td data-title="PORT">9000</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">中国 江苏省 镇江市 电信</td> <td data-title="响应速度">3秒</td> <td data-title="最后验证时间">2019-06-17 20:30:59</td> </tr> <tr> <td data-title="IP">117.91.248.174</td> <td data-title="PORT">9999</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">江苏省扬州市 电信</td> <td data-title="响应速度">2秒</td> <td data-title="最后验证时间">2019-06-17 19:30:59</td> </tr> <tr> <td data-title="IP">112.87.69.69</td> <td data-title="PORT">9999</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">江苏省南通市 联通</td> <td data-title="响应速度">0.5秒</td> <td data-title="最后验证时间">2019-06-17 18:30:59</td> </tr> <tr> <td data-title="IP">114.234.81.34</td> <td data-title="PORT">9000</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">江苏省徐州市 电信</td> <td data-title="响应速度">1秒</td> <td data-title="最后验证时间">2019-06-17 17:31:00</td> </tr> <tr> <td data-title="IP">124.205.143.212</td> <td data-title="PORT">40585</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">北京市北京市 鹏博士宽带</td> <td data-title="响应速度">2秒</td> <td data-title="最后验证时间">2019-06-17 16:30:54</td> </tr> <tr> <td data-title="IP">121.13.252.60</td> <td data-title="PORT">41564</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">广东省东莞市 电信</td> <td data-title="响应速度">0.7秒</td> <td data-title="最后验证时间">2019-06-17 15:30:59</td> </tr> <tr> <td data-title="IP">183.129.244.16</td> <td data-title="PORT">12154</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">浙江省杭州市 电信</td> <td data-title="响应速度">1秒</td> <td data-title="最后验证时间">2019-06-17 14:31:00</td> </tr> <tr> <td data-title="IP">219.159.38.208</td> <td data-title="PORT">56210</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">内蒙古自治区赤峰市 联通</td> <td data-title="响应速度">2秒</td> <td data-title="最后验证时间">2019-06-17 13:30:59</td> </tr> <tr> <td data-title="IP">122.243.11.150</td> <td data-title="PORT">9000</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">浙江省金华市 电信</td> <td data-title="响应速度">1秒</td> <td data-title="最后验证时间">2019-06-17 12:31:01</td> </tr> <tr> <td data-title="IP">183.129.244.16</td> <td data-title="PORT">14153</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">浙江省杭州市 电信</td> <td data-title="响应速度">0.8秒</td> <td data-title="最后验证时间">2019-06-17 11:31:01</td> </tr> <tr> <td data-title="IP">47.100.21.174</td> <td data-title="PORT">8118</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">上海市上海市 阿里云</td> <td data-title="响应速度">3秒</td> <td data-title="最后验证时间">2019-06-17 10:31:00</td> </tr> <tr> <td data-title="IP">27.188.64.70</td> <td data-title="PORT">8060</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">河北省邯郸市 电信</td> <td data-title="响应速度">1秒</td> <td data-title="最后验证时间">2019-06-17 09:31:01</td> </tr> <tr> <td data-title="IP">139.217.233.32</td> <td data-title="PORT">8118</td> <td data-title="匿名度">高匿名</td> <td data-title="类型">HTTP</td> <td data-title="位置">北京市海淀区 微软(中国)有限公司 BGP多线</td> <td data-title="响应速度">3秒</td> <td data-title="最后验证时间">2019-06-17 08:31:01</td> </tr> </tbody> </table> re: <td data-title="IP">(.*?)</td>.*? <td data-title="PORT">(.*?)</td> ''' import requests import re import time HEADERS = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36', } def get_index(url): time.sleep(1) response = requests.get(url, headers=HEADERS) return response def parse_index(text): ip_list = re.findall('<td data-title="IP">(.*?)</td>.*? <td data-title="PORT">(.*?)</td>', text, re.S) for ip_port in ip_list: ip = ':'.join(ip_port) yield ip def test_ip(ip): print('测试ip: %s' % ip) try: proxies = { 'https': ip } # ip测试网站 ip_url = 'https://www.ipip.net/' # 使用有效与无效的代理对ip测试站点进行访问,若返回的结果为200则代表当前测试ip正常 response = requests.get(ip_url, headers=HEADERS, proxies=proxies, timeout=1) if response.status_code == 200: return ip # 若ip代理无效则抛出异常 except Exception as e: print(e) # 使用代理爬取nba def spider_nba(good_ip): url = 'https://china.nba.com/' proxies = { 'https': good_ip } response = requests.get(url, headers=HEADERS, proxies=proxies) print(response.status_code) print(response.text) if __name__ == '__main__': base_url = 'https://www.kuaidaili.com/free/inha/{}/' for line in range(0, 2904): ip_url = base_url.format(line) response = get_index(ip_url) ip_list = parse_index(response.text) for ip in ip_list: # print(ip) good_ip = test_ip(ip) if good_ip: # 真是代理,开始测试 spider_nba(good_ip)