爬虫(requests库,logging库)

requests 的使用

Get请求

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

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

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

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

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

  • 配置请求头

python 复制代码
    import requests
    
    headers = {
        '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请求

python 复制代码
    import requests
    
    data = {
        'name':'germey',
        'age':'25'
    }
    
    
    r = request.post('url',params=data)
    print(r.text)

响应

  • 状态码

  • 响应头

  • Cookie

python 复制代码
    import requests
    r = request.get('url')
    
    
    print(r.status_code)
    print(r.headers)
    print(r.cookies)
    print(r.url)
    print(r.history)

高级用法

  • 文件上传
python 复制代码
    import requests
    
    
    file = {'file':open('favicon.ico','rb')}
    r = requests.post('url',file=file)
    print(t.text)
  • 设置Cookie
python 复制代码
    # 获取Cookie
    
    import requsets
    
    r = requests.get('https://www.baidu.com')
    print(r.cookies)
    
    for key,value in r.cookies.items():
        print(key + '=' + value)
    
    
    
    # 我们从网站上复制请求头
    
    
    import requests
    
    
    headers = {
        '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则可以有开发者决定将信息输出到什么地方,以及怎么输出

基本使用

python 复制代码
    import logging
    logging.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")
    
    
    
    # 当我们需要对日志的输出进行一些格式上的要求,我们就可以这样写,注:配置项要写在最上面,否则可能会出现各种bug
    logging.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'))
    
    # 这里面可以放入多个handler
    test_logger.addHandler(file_handler)
    
    
    # 异常处理
    try:
        1/0
    except:
        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:打印日志信息
相关推荐
TomEval4 分钟前
【测AI】第05篇:Python 爬虫进阶 —— 动态页面爬取与 Scrapy 框架
人工智能·爬虫·python·scrapy·自动化
老王生涯21 小时前
针对cloudflare防护的爬虫策略——CDP
爬虫·cloudflare·cdp·反爬
禹凕1 天前
机器学习之数据清洗(Machine Learning about Data Cleaning)
人工智能·爬虫·python·机器学习·数据挖掘
数据狐(Datafox)1 天前
淘宝商品详情API实战:多语言代购商城自动同步数据完整方案
开发语言·前端·数据库·爬虫·json
梅孔立8 天前
Fiddler 工具安装抓包 教程 https
爬虫
feasibility.8 天前
MediaCrawler媒体采集平台安装与使用
爬虫·抖音·小红书·微博·bili
Patrick在香港8 天前
Claude 工具调用返回空:8 次失败里只有 1 次状态码不对,其余全带 200
爬虫·python·api·claude·香港
小静AI工程实验室10 天前
Python 爬虫中文乱码排查:严格解码、UTF-8 BOM 与 JSON 转义的 12 项实验
字符编码·爬虫·python
咖啡星人k10 天前
从自建爬虫到托管工具:数据采集选型对照表
爬虫·数据采集·mcp
电商API_1800790524711 天前
拍照找同款是怎么实现的?淘宝以图搜图接口 item_search_img 对接实战
大数据·爬虫·数据挖掘·数据分析·代采api