• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
山城小跳
博客园    首页    新随笔    联系   管理    订阅  订阅

python_爬虫基础

python爬虫基础

1、初识爬虫

1.rebots协议

网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,但它仅仅是互联网中的约定而已,可以不用遵守。例如:https://www.taobao.com/robots.txt

2.谷歌浏览器插件

● XPath Helper
● Web Scraper
● Toggle JavaScript
● User-Agent Switcher for Chrome
● EditThisCookie
● SwitchySharp

插件下载地址:

  1. https://extfans.com/
  2. https://chrome.zzzmh.cn/#/index
    安装步骤:
    1、在应用商店下载好插件后解压缩,直接拖进去就可以啦:

3.requests发送网络请求以及常用属性

需求:通过requests向百度首页发送请求,获取百度首页数据

import requests

url = "https://www.baidu.com"

response = requests.get(url=url)

print("---状态码如下---")
print(response.status_code)

print("---bytes类型数据:---")
print(response.content)

print("---str类型数据---")
print(response.text)

print("---str类型数据(utf-8)---")
print(response.content.decode("utf-8"))

常用属性如下:
● response.text 响应体str类型
● respones.content 响应体bytes类型
● response.status_code 响应状态码
● response.request.headers 响应对应的请求头
● response.headers 响应头
● response.request.headers.get('cookies') 响应对应请求的cookie
● response.cookies 响应的cookie(经过了set-cookie动作)
● response.url请求的URL

4、iter_content方法

如果下载一个较大的资源,例如一个视频,可能需要的下载时间较长,在这个较长的下载过程中程序是不能做别的事情的(当然可以使用多任务来解决),如果在不是多任务的情况下,想要知道下载的进度,此时就可以通过类似迭代的方式下载部分资源。

使用iter_content

r = requests.get('https://www.baidu.com', stream=True)

with open('test.html', 'wb') as f:
    for chunk in r.iter_content(chunk_size=100):
        f.write(chunk)

在获取数据时,设置属性stream=True
● 如果设置了stream=True,那么在调用iter_content方法时才会真正下载内容
● 如果没设置stream属性则调用requests.get就会耗费时间下载

5、重定向与历史请求

思考:为什么打印出来的url不是请求的url呢?
想要搞清楚这个问题,就要知道requests的重定向问题。

requersts的默认情况
默认情况下,requests发送的请求除了方式为HEAD之外,其余的请求例如GET、POST等都是能自动进行重 定向的
这也就是为什么上面明明访问的是http://www.baidu.com而打印出来之后是https://m.baidu.com/?from=844b&vit=fps的原因

取消自动重定向
在发送请求的时候,可以通过如下的设置,取消requests模块的自动重定向功能

requests.get(url, allow_redirects=False)

6、SSL证书问题

在浏览网页时,可能会遇到以下这种情况:

出现这个问题的原因是:ssl证书不安全导致的。

7、retrying模块的使用

使用超时参数能够加快我们整体的运行速度。但是在普通的生活中当我们使用浏览器访问网页时,如果发生速度很慢的情况,我们会做的选择是刷新页面。那么在代码中,我们是否也可以刷新请求呢?
在本小节中我们使用retrying模块来完成需求。

# 安装指令如下:
pip install retrying -i https://pypi.tuna.tsinghua.edu.cn/simple

作用:

  1. 使用retrying模块提供的retry模块
  2. 通过装饰器的方式使用,让被装饰的函数反复执行
  3. retry中可以传入参数stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行
import requests
from retrying import retry

num = 1


@retry(stop_max_attempt_number=3)
def _parse_url(url):
    global num
    print("第%d次尝试" % num)
    num += 1
    headers = {
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
    }
    # 超时的时候会报错并重试
    response = requests.get(url, headers=headers, timeout=3)
    # 状态码不是200,也会报错并重试
    assert response.status_code == 200  # 此语句是"断言",如果assert后面的条件为True则呈现继续运行,否则抛出异常
    return response


def parse_url(url):
    # 进行异常捕获
    try:
        response = _parse_url(url)
    except Exception as e:
        print("产生异常:", e)
        # 报错返回None
        response = None
    return response


if __name__ == '__main__':
    url = "https://chinasoftinc.com/owa"
    # url = "https://www.baidu.com"
    print("----开始----")
    r = parse_url(url=url)
    print("----结束----", "响应内容为:", r)
posted @ 2024-07-30 18:51  字母一哥  阅读(116)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3