python爬虫代理ip的爬取与使用并存入数据库(requests+xpath)


前言

使用软件: pycharm navicat
学习连接:https://www.bilibili.com/video/BV1Hg4y1z76H?spm_id_from=333.880.my_history.page.click
爬取区域:快代理的免费代理


提示:以下是本篇文章正文内容,下面案例可供参考

一、下载库

#直接在Terminal下载
pip install requests
pip install parsel
pip install pymysql
  • 出现问题就换个镜像去下载(比如:Could not find a version that satisfies the requirement urllib3)
pip install 包的名字 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

二、步骤

1.引入库

import re			#正则表达式
import pymysql		#连接数据库
import requests		#request请求
import parsel		#解析数据
import time			# 时间模块

2.代码

#获取数据函数
def getData():
    list = []
    for page in range(1100,1200):
        print('===================获取第{}页的数据================'.format(page))
        urls = 'https://free.kuaidaili.com/free/inha/{}/'.format(str(page))
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
        }

        #发送请求
        response = requests.get(urls,headers = headers)
        # 获取数据 文本格式
        data = response.text
        # 转换数据类型
        html_data = parsel.Selector(data)
        #数据解析 //跨界点标曲
        path_list = html_data.xpath('//table[@class = "table table-bordered table-striped"]/tbody/tr')
        
        #遍历
        for tr in path_list:
            # print(tr)
            
            dict_proxies = {}
            
            # td标签包裹的文本
            http_type = tr.xpath('./td[4]/text()').extract_first()        #协议类型
            ip_num = tr.xpath('./td[1]/text()').extract_first()           #ip
            ip_port = tr.xpath('./td[2]/text()').extract_first()          #端口

            # print(http_type,ip_num,ip_port)
            
            #构建ip字典	代理ip使用格式 {"协议类型":"ip:端口"}
            dict_proxies[http_type] = ip_num+':'+ip_port
            print(dict_proxies)
            list.append(dict_proxies)
            
            time.sleep(0.5)

    print(list)
    print('获取到数量',len(list))
    return list

#检测代理ip的质量 用百度网址测试
def check_ip(list):
    #可以使用的ip的列表
    can_use = []
    #头部信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
    }
    #遍历获取到的ip
    for proxy in list:
        try:
        	#发送请求
            response = requests.get('https://www.baidu.com',headers = headers,proxies = proxy,timeout = 0.1)
            #请求成功 返回服务为200
            if response.status_code ==200:
                can_use.append(proxy)
        
        except Exception as e:
            print(e)
        
        finally:
            print('当前ip:',proxy,'检测通过')
    
    return can_use

#连接数据库
def connectMysql(can_use):
	#遍历检测成功的ip
    for i in can_use:
        # print(i)
    
        item = str(i)								#转换为字符串类型
        
        #找到协议类型(HTTP / HTTPS)
        findh = re.compile(r'[A-Z]+')				
        http_type = re.search(findh,item).group()	
		
		#找ip与端口号
        findi = re.compile(r'\b((25[0-5]|2[0-4]\d|[0-1]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[0-1]?\d\d?):\d+\b')							
        ip_num = re.search(findi, item).group()
        
        print(http_type,ip_num)
		
		#连接数据库
        connect = pymysql.Connection(host='localhost',user='root',password='152800',port=3306,database='ip')											
        cursor = connect.cursor()
        sql ='insert into agent_ip (http_type,ip_num) VALUES (%s,%s)'
        cursor.execute(sql,[http_type,ip_num])
        connect.commit()

#主函数
def main():
	#获取ip
    list = getData()
	
	#检测ip
    can_use = check_ip(list)
    print('能用的:', can_use)
    print('数量:', len(can_use))
	
	#连接数据库
    connectMysql(can_use)

if __name__ == '__main__':
    main()


总结

爬取的过程中很有可能会因为网络不好而报错!
爬取的话只能重新爬 下一步的优化 应该是要获取到断开时候爬取的位置以及在断开前把数据传入数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!小白菜!y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值