爬虫(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:打印日志信息
相关推荐
简简单单就是我_hehe10 小时前
前端埋点日志解决方案:完整 User-Agent 解析工具实现,爬虫识别、设备品牌、操作系统、浏览器版本全解析(附完整源码)
前端·爬虫
上海云盾-小余11 小时前
遭 CC 攻击店铺直接瘫痪?WAF + 流量防护双重锁死恶意爬虫
爬虫
Web极客码17 小时前
跨国网络抖动下的 AI 爬虫流调优:我如何用 Claude 打造“智能退避”资讯清洗管道
网络·人工智能·爬虫
武子康20 小时前
调查研究-217 Fortress:当浏览器 Agent 开始被网站识别,开源 Chromium 反拦截引擎来了
人工智能·爬虫·agent
标致的自行车2 天前
Selenium 爬虫固定开头:
爬虫·selenium·测试工具
深蓝电商API2 天前
Flutter App逆向初探:Dart编译产物的分析思路
爬虫
taocarts_bidfans3 天前
Playwright 浏览器指纹伪装 + 住宅代理池 日系电商爬虫防封禁实战
爬虫·bidfans
许彰午3 天前
73_Python爬虫Scrapy框架入门
爬虫·python·scrapy
深蓝电商API3 天前
模拟器批量操控:雷电/夜神 + ADB集群方案
数据仓库·爬虫·adb
许彰午3 天前
72_Python爬虫基础BeautifulSoup
爬虫·python·beautifulsoup