爬虫(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:打印日志信息
相关推荐
攻城狮7号2 小时前
Python爬虫第18节-动态渲染页面抓取之Splash使用上篇
开发语言·人工智能·爬虫·python·python爬虫
像风一样自由20202 小时前
从零开始构建微博爬虫与数据分析系统
爬虫·python
yuanlaile15 小时前
AI写代码之GO+Python写个爬虫系统
爬虫·python·go·ai编程
愚公搬代码15 小时前
【愚公系列】《Python网络爬虫从入门到精通》057-分布式爬取中文日报新闻数据
分布式·爬虫·python
亿牛云爬虫专家16 小时前
GraphQL接口采集:自动化发现和提取隐藏数据字段
爬虫·爬虫代理·graphql·代理ip·yelp·采集·数字字段
愚公搬代码17 小时前
【愚公系列】《Python网络爬虫从入门到精通》063-项目实战电商数据侦探(主窗体的数据展示)
开发语言·爬虫·python
攻城狮7号1 天前
Python爬虫第16节-动态渲染页面抓取之Selenium使用上篇
爬虫·python·python爬虫
wisdom_zhe1 天前
DeepSeek和Excel结合生成动态图表
爬虫·信息可视化·excel
用户199701080181 天前
Python 实战:用 API 接口批量抓取小红书笔记评论,解锁数据采集新姿势
大数据·爬虫·数据挖掘