爬取了五千多个代理IP 花刺代理验证1.8( 二 )


5、保存数据
此处代码也较少,直接写在主函数中 。
# 以CSV格式保存数据df = pd.DataFrame(items)df.to_csv('IP_data.csv',index=False,sep=',',encoding='utf-8-sig')
6、完整代码
这样一个爬取代理IP的完整流程代码就完成了 。完整代码如下:
import requestsimport pandas as pdimport randomimport timefrom bs4 import BeautifulSoup as BS# 构建请求函数,返回得到的响应def req_res(url):  # 构建请求函数第一步——构建头部信息 USER_AGENT = [ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", ] user_agent = random.choice(USER_AGENT) headers = { 'User-Agent':user_agent }  # 构建请求函数第二步——构建代理池 # 本文就是为了爬取代理池,此处略  # 发起请求,获取响应 response = requests.get(url,headers = headers).text  # 返回响应 return response# 构建解析函数,返回数据(以字典格式返回)def parse_res(response,items):  soup = BS(response)  # 先取出所需数据的所有存放地——<tr></tr> tr_list = soup.select('#ip_list > tr')[1:]  # 通过遍历tr列表取出所需数据——这里演示都取出,实际只需要ip地址和端口 for tr in tr_list:  # 获取ip地址 ip_add = tr.select('td')[1].text  # 获取端口 port = tr.select('td')[2].text  # 获取服务器地址 server_add = tr.select('td')[3].text.strip()  # 获取是否匿名信息 anonymous_type = tr.select('td')[4].text  # 获取http类型 http_type = tr.select('td')[5].text  # 获取连接速度 SPEED = tr.select('td')[6] speed = SPEED.div.attrs['title'][:-1]  # 获取连接时间 TIME_CO = tr.select('td')[7] time_co = TIME_CO.div.attrs['title'][:-1]  # 获取存活时间 time_ar = tr.select('td')[8].text  # 获取验证时间 time_pr = tr.select('td')[9].text  # 将以上数据录入一个字典 item = { 'IP地址':ip_add, '端口':port, '服务器地址':server_add, '匿名信息':anonymous_type, '类型':http_type, '连接速度':speed, '连接时间':time_co, '存活时间':time_ar, '验证时间':time_pr }  items.append(item)  # 返回数据 return items# 定义一个主函数def main():  # 输入固定的参数 url = 'https://www.xicidaili.com/nn/' start_page = int(input('\n请输入起始页码:')) end_page = int(input('\n请输入结束页码:')) items = []  # 构建一个循环,用于爬取任意某页至某页 for page in range(start_page,end_page+1):  print('\n第{}页开始爬取'.format(page))  # 拼接网页 url_new = url + str(page) + '/'  # 请求网页,获取响应——通过构建函数:req_res 实现 response = req_res(url_new)  # 解析响应——通过构建函数: parse_res 实现 items = parse_res(response,items)  # 休眠5秒 time.sleep(2)  print('\n第{}页结束爬取'.format(page))  # 以CSV格式保存数据 df = pd.DataFrame(items) df.to_csv('IP_data.csv',index=False,sep=',',encoding='utf-8-sig')  print('*'*30) print('全部爬取结束')if __name__ == '__main__': main()