当前位置: 首页 > web >正文

爬虫(requests库,logging库)

requests 的使用

Get请求

  • params 参数进行传递各种信息
    import requestsdata = {'name':'germey','age':'25'}r = request.get('url',params=data)print(r.text)
  • json方法

    如果返回的数据类型是json,可以直接用json方法

    r = request.get('url',params=data)print(r.json())# 如果数据返回的不是JSON格式,就会出现解析错误,抛出json.decoder.JSONDecodeErrot异常
  • r.text 和 r.content 的区别

    • r.text 中打印时会转换成 str 类型

    • r.content 的前面带有一个b, 代表这是 bytse 类型的数据

  • 配置请求头

    import requestsheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0','Host':'www.httpbin.org'}r = request.get('url',headers=headers)

POST请求

    import requestsdata = {'name':'germey','age':'25'}r = request.post('url',params=data)print(r.text)

响应

  • 状态码

  • 响应头

  • Cookie

    import requestsr = request.get('url')print(r.status_code)print(r.headers)print(r.cookies)print(r.url)print(r.history)

高级用法

  • 文件上传
    import requestsfile = {'file':open('favicon.ico','rb')}r = requests.post('url',file=file)print(t.text)
  • 设置Cookie
# 获取Cookieimport requsetsr = requests.get('https://www.baidu.com')print(r.cookies)for key,value in r.cookies.items():print(key + '=' + value)# 我们从网站上复制请求头import requestsheaders = {'Cookie':'...','User-Agent':'...'}r = requsets.get('https://github.com/',headers=headers)print(r.text)# 创建一个RequestCookieJar 对象cookies = '..'jar = requsets.cookies.RequestsCookieJar()for cookie in cookies.split(';'):key,value = cookie.split('=',1)jar.set(key,value)r = requests.get('https://github.com/',cookies=jar,headers=headers)
  • Session

    • 它通常在模拟登录成功之后,进行下一步操作时用到

      s = requests.Session()
      s.get(‘url’)

  • 请求中的一些参数

    • SSL错误

      • 将请求中的verify=False,就可以解决了
    • timeout 参数

      • timeout = 1

      • timeout=(5,30)

    • 用户认证

      • auth=(‘…’,‘…’)
    • 代理设置

      • proxies=proxies

      • 其中proxies是一个代理池

正则表达式

常用的方法

  • match

    • 从字符串的起始位置开始匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,就返回None
  • search

    • 它会搜索整个HTML文本,找到符合上述正则表达式的第一个内容并返回,尽量加上re.S ----> 以免出现匹配不到的问题
  • findall

    • 获取全部匹配的内容
  • sub

    • 借助它来修改文本
  • compile

    • 这个方法将正则字符串编译成正则表达式对象,以便在后面的匹配中复用

logging模块简介

相比print的优点有如下

  • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必现实大量的调试信息

  • print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据,logging则可以有开发者决定将信息输出到什么地方,以及怎么输出

基本使用

    import logginglogging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 这句得到了一个logger实例,__name__这个参数,得到运行的模块名字logger = logging.getLogger(__name__)# 这里的等级依次递增# 默认配置中只会打印 warning 级别以上的日志# 可以通过配置修改打印级别# logging.basicConfig(level=logging.INFO)logger.info("Start print log")logger.debug("Do something")logger.warning("Something maybe fail.")logger.info("Finish")# 当我们需要对日志的输出进行一些格式上的要求,我们就可以这样写,注:配置项要写在最上面,否则可能会出现各种buglogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 将日志输出到文件中logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',filename='TryLog.log',filemode='a')# 获得自定义的 logger# 注:这里的参数 text_logger 是该logger的名字,# 很多人会用__name__ 来命名# root 这个是全局的logger的名字test_logger = logging.getLogger('text_logger')# 创建一个Handler 实例 -----> 指定了文件名和文件的打开方式file_handler = logging.FileHandler('text_logger.txt',mode='a')# handler 里面可以设置basicConfig 里面大多数的配置,比如下面的输出格式file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))# 这里面可以放入多个handlertest_logger.addHandler(file_handler)# 异常处理try:1/0except:text_logger.exception("Get exception")参数:作用%(levelno)s:打印日志级别的数值%(levelname)s:打印日志级别的名称%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]%(filename)s:打印当前执行程序名%(funcName)s:打印日志的当前函数%(lineno)d:打印日志的当前行号%(asctime)s:打印日志的时间%(thread)d:打印线程ID%(threadName)s:打印线程名称%(process)d:打印进程ID%(message)s:打印日志信息
http://www.xdnf.cn/news/1079.html

相关文章:

  • Linux ssh免密登陆设置
  • 【ECharts】ECharts曲线图节点点击事件实现
  • React18+ 项目搭建-从初始化、技术选型到开发部署的全流程规划
  • ProxySQL 性能调优实战案例
  • npm的基本使用安装所有包,安装删除指定版本的包,配置命名别名
  • 遨游通讯发布国产化旗舰三防手机AORO AU1:以自主可控重塑工业安全
  • 基于 Vue 的Tiptap 富文本编辑器使用指南
  • 【MCP Node.js SDK 全栈进阶指南】中级篇(4):MCP错误处理与日志系统
  • 【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础
  • TextCNN 模型文本分类实战:深度学习在自然语言处理中的应用
  • 宏碁笔记本电脑怎样开启/关闭触摸板
  • 高并发抢券系统设计与落地实现详解
  • 【git】subtree拆分大的git库到多个独立git库
  • @Configuration注解对应实现implements WebMvcConfigurer的配置不生效问题。
  • Java实例化对象都有几种方式
  • React 单一职责原则:优化组件设计与提高可维护性
  • 马浩棋:产通链CT-Chain 破局不动产 RWA,引领数智金融新变革
  • 程序生成随机数
  • 什么是API
  • 数智读书笔记系列030《曲折的职业道路:在终身工作时代找准定位》与《做自己的教练:战胜工作挑战掌控职业生涯》
  • 离线-DataX
  • 【AI微信小程序开发】大转盘小程序项目代码:自设转盘选项和概率(含完整前端+后端代码)
  • 刷题之路:C++ 解题分享与技术总结
  • Yocto项目实战教程-第7章定制镜像菜谱与内核菜谱-7.2小节-定制应用程序
  • 眼镜眨巴眨巴-一步几个脚印从头设计数字生命2——仙盟创梦IDE
  • OpenHarmony OS 5.0与Android 13显示框架对比
  • 【python】如何将文件夹及其子文件夹下的所有word文件汇总导出到一个excel文件里?
  • 操作系统-用户级-内核级线程
  • 西门子地址表规划中,如WM200与WM201这样相邻地址冲突问题
  • 工厂模式:工厂方法模式 和 抽象工厂模式