影816 2022-01-26 20:48 采纳率: 66.7%
浏览 1287
已结题

爬虫报错TypeError: stat: path should be string, bytes, os.PathLike or integer, not function,如何解决?

问题遇到的现象和发生背景

用PyCharm爬取https://www.dieniao.com的免费代理IP时,出现错误TypeError: stat: path should be string, bytes, os.PathLike or integer, not function。用的环境是Anaconda

问题相关代码,请勿粘贴截图
#免费获取代理IP
import requests
import urllib3
from lxml import etree
import pandas as pd
from sqlalchemy import false

ip_list = []                                                #创建保存IP地址的列表
urllib3.disable_warnings()

def get_ip(url,headers):
    #发送网络请求
    response = requests.get(url,headers=headers,verify = false)
    response.encoding = 'utf-8'                             #设置编码方式
    if response.status_code == 200:                         #判断请求是否成功
        html = etree.HTML(response.text)                    #解析HTML
        #获取所有带有IP的li标签
        li_all = html.xpath('//li[@class="f-list col-lg-12 col-md-12 col-sm-12 col-xs-12"]')
        for i in li_all:                                            #遍历每行内容
            ip = i.xpath('span[@class="f-address"]/text()')[0]  #获取IP
            port = i.xpath('span[@class="f-port"]/text()')[0]   #获取端口
            ip_list.append(ip+':'+port)                         #将IP与端口组合并添加至列表当中
            print('代理ip为:', ip, '对应端口为:', port)
#头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'}
if __name__ == '__main__':
    ip_table = pd.DataFrame(columns=['ip'])                     #创建临时表格数据
    for i in range(1,5):
        #获取免费代理IP的请求地址
        url = 'https://www.dieniao.com/FreeProxy/{page}.html'.format(page=i)
        get_ip(url,headers)
    ip_table['ip'] = ip_list                        #将提取的IP保存至Excel文件的IP列
    #生成xlsx文件
    ip_table.to_excel('ip.xlsx', sheet_name='data')

img

想让程序正常运行,爬取到IP

  • 写回答

2条回答 默认 最新

  • CSDN专家-HGJ 2022-01-26 21:38
    关注

    由于参数verify的值写错了,应该为verify=Faslse。在调用adapter模块时以为读取是证书文件,调用时报错。代码修改成如下即可:

    import requests
    import urllib3
    from lxml import etree
    import pandas as pd
    from sqlalchemy import false
    
    ip_list = []  # 创建保存IP地址的列表
    urllib3.disable_warnings()
    
    
    def get_ip(url, headers):
        #发送网络请求
        response = requests.get(url, headers=headers, verify=False)
        response.encoding = 'utf-8'  # 设置编码方式
        if response.status_code == 200:  # 判断请求是否成功
            html = etree.HTML(response.text)  # 解析HTML
            #获取所有带有IP的li标签
            li_all = html.xpath(
                '//li[@class="f-list col-lg-12 col-md-12 col-sm-12 col-xs-12"]')
            for i in li_all:  # 遍历每行内容
                ip = i.xpath('span[@class="f-address"]/text()')[0]  # 获取IP
                port = i.xpath('span[@class="f-port"]/text()')[0]  # 获取端口
                ip_list.append(ip+':'+port)  # 将IP与端口组合并添加至列表当中
                print('代理ip为:', ip, '对应端口为:', port)
        return ip_list
    
    #头部信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'}
    if __name__ == '__main__':
        ip_table = pd.DataFrame(columns=['ip'])  # 创建临时表格数据
        iplst=[]
        for i in range(1, 5):
            #获取免费代理IP的请求地址
            url = 'https://www.dieniao.com/FreeProxy/{page}.html'.format(page=i)
            ip_list=get_ip(url, headers)
            iplst+=ip_list
        ip_table['ip'] = iplst  # 将提取的IP保存至Excel文件的IP列
        #生成xlsx文件
        ip_table.to_excel('ip.xlsx', sheet_name='data')
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月4日
  • 已采纳回答 1月27日
  • 创建了问题 1月26日

悬赏问题

  • ¥100 iOS开发关于快捷指令截屏后如何将截屏(或从截屏中提取出的文本)回传给本应用并打开指定页面
  • ¥15 unity连接Sqlserver
  • ¥15 图中这种约束条件lingo该怎么表示出来
  • ¥15 VSCode里的Prettier如何实现等式赋值后的对齐效果?
  • ¥15 流式socket文件传输答疑
  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接