• python 爬虫 - 学习 urllib 和 requests 使用,模拟请求


    前言

    上篇我们了解了爬虫的基本知识,这次我们来学习下,如何用 Python 模拟浏览器访问网站和登录。

    正文

    Python 如此方便,正是因为它提供了很多实现好各种功能的库,它内置了许多非常有用的模块,无需额外安装和配置,即可直接使用。

    同时也有很多第三方模块,我们只需要用好各种工具库和模块,就能实现很多方便的操作,用程序来代替繁琐的功能。

    这次我们来学习 urllibrequests 模块,实现模拟请求。

    urllib 介绍

    Python 内置的 HTTP 请求库,安装好 Python 就能用,它是最基本的请求库,用于访问网络资源,程序发起请求,获取响应数据,使用该库实现。

    主要有 4 个模块

    >urllib.request 请求模块

    urllib.error 异常处理模块,捕获请求和响应中出现的错误

    urllib.parse url 解析模块,提供 url 处理方法,拆分合并

    urllib.robotparser robots.txt 解析模块

    使用

    get 请求

    get 请求一般是我们在浏览器地址直接输入一个地址,就能能访问到网页。

    urllib 的 request 模块可以非常方便地抓取 URL 内容,也就是发送一个 GET 请求到指定的页面,然后返回 HTTP 的响应:

    1. # 导入urllib.request
    2. import urllib.request
    3. # 向指定的url发送请求,并返回服务器响应的类文件对象
    4. response = urllib.request.urlopen("http://www.baidu.com")
    5. # 类文件对象支持文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
    6. html = response.read()
    7. # 打印字符串
    8. print (html)

    我们可以浏览器上打开百度, 右键选择“查看源代码”,你会发现,跟我们刚才打印出来的是一模一样,经过浏览器渲染,就是好看的百度页面。

    也就是说,上面的代码就已经帮我们把百度的首页的全部代码爬了下来。

    post 请求

    一般我们想要向某一个地方发送数据,就需要用到 post 请求。

    像我们登陆网站,下订单等,都是用 post 实现。

    1. # POST请求的目标URL
    2. url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
    3. headers={"User-Agent": "Mozilla"}
    4. formdata = {
    5. "type":"AUTO",
    6. "i":"i love python",
    7. "doctype":"json",
    8. "xmlVersion":"1.8",
    9. "keyfrom":"fanyi.web",
    10. "ue":"UTF-8",
    11. "action":"FY_BY_ENTER",
    12. "typoResult":"true"
    13. }
    14. data = urllib.parse.urlencode(formdata)
    15. request = urllib.request.Request(url, data = data, headers = headers)
    16. response = urllib.request.urlopen(request)
    17. print (response.read())

    发送 POST 请求时,需要特别注意 headers 的一些属性,这个 headers 的作用就是让请求模拟浏览器发送。

    headers 属性有:

    >Content-Length: 144: 是指发送的表单数据长度为 144,也就是字符个数是 144 个。

    Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。

    X-Requested-With: XMLHttpRequest :表示 Ajax 异步请求。

    requests

    相对于 urllib,第三方库 requests 增加很多实用的高级功能,处理 URL 资源特别方便。

    它包含了 urllib 全部的功能,可以节约大部分的工作。

    一句话概括:Python 实现的简单易用的 HTTP 库

    windows 安装:

    1. pip install requests
    2. pip list -- 可查看已安装的库

    验证安装是否成功:

    win 键+x 选择 命令提示符。输入以下命令:

    1. Python
    2. import requests
    3. //没报错就成功安装了

    GET 请求

    1. import requests
    2. kw = {'wd':'英雄联盟'}
    3. headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    4. # params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
    5. response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
    6. # 查看响应内容,response.text 返回的是Unicode格式的数据
    7. print (response.text)
    8. # 查看响应内容,response.content返回的字节流数据
    9. print (responese.content)
    10. # 查看完整url地址
    11. print (response.url)
    12. # 查看响应头部字符编码
    13. print (response.encoding)
    14. # 查看响应码
    15. print (response.status_code)

    使用 response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。

    使用 response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。

    POST 请求

    要发送 POST 请求,只需要把 get()方法变成 post(),然后传入 data 参数作为 POST 请求的数据

    1. import requests
    2. formdata = {
    3. "type":"AUTO",
    4. "i":"i love python",
    5. "doctype":"json",
    6. "xmlVersion":"1.8",
    7. "keyfrom":"fanyi.web",
    8. "ue":"UTF-8",
    9. "action":"FY_BY_ENTER",
    10. "typoResult":"true"
    11. }
    12. url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
    13. headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    14. response = requests.post(url, data = formdata, headers = headers)
    15. print (response.text)
    16. # 如果是json文件可以直接显示
    17. print (response.json())`

    Cookies 和 Sission

    如果一个响应中包含了 cookie,那么我们可以利用 cookies 参数拿到:

    1. import requests
    2. response = requests.get("http://www.baidu.com/")
    3. # 返回CookieJar对象:
    4. cookiejar = response.cookies
    5. # 将CookieJar转为字典:
    6. cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
    7. print (cookiejar)
    8. print (cookiedict)

    运行结果:

    1. >>> print (cookiejar)
    2. <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
    3. >>>
    4. >>> print (cookiedict)
    5. {'BDORZ': '27315'}

    在 requests 里,session 对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。

    抢茅台脚本,一直保持登陆状态的实现:

    1. def _validate_cookies(self):
    2. """
    3. 验证cookies是否有效(是否登陆)
    4. 通过访问用户订单列表页进行判断:若未登录,将会重定向到登陆页面。
    5. :return: cookies是否有效 True/False
    6. """
    7. url = 'https://order.jd.com/center/list.action'
    8. payload = {
    9. 'rid': str(int(time.time() * 1000)),
    10. }
    11. try:
    12. resp = self.session.get(url=url, params=payload, allow_redirects=False)
    13. if resp.status_code == requests.codes.OK:
    14. return True
    15. except Exception as e:
    16. logger.error("验证cookies是否有效发生异常", e)
    17. return False

    后面的请求,都是使用 requests.session 对象去发起,这样能保证每次请求都是在登陆状态下的。

    另外,附上 requests 的其他常用的方法:

    >requests.request() 构造一个请求,支持以下各种方法

    requests.get() 获取 html 的主要方法

    requests.head() 获取 html 头部信息的主要方法

    requests.post() 向 html 网页提交 post 请求的方法

    requests.put() 向 html 网页提交 put 请求的方法

    requests.patch() 向 html 提交局部修改的请求

    requests.delete() 向 html 提交删除请求

    最后

    学习 urllib 和 requests 使用,是我们学习爬虫最关键的一步。

    对我们来说,能学会爬虫,相当于也熟悉了 python,可以自己写一写自动化的程序,减少很多重复的劳动,提高我们的工作效率,有更多时间做自己想做的事情。

  • 相关阅读:
    基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)
    南瓜科学新品上线 开辟益智玩具新世界
    编写第一个Go程序
    Python从入门到项目实战————程序逻辑结构
    display详解
    【前端】HTTP相关知识总结
    矩阵按键简单使用
    【C语言】自定义类型:联合体和枚举
    众佰诚:抖音开网店新手怎么做才能做起来
    uniapp微信小程序如何返回上一页的左上角小房子的坑
  • 原文地址:https://blog.csdn.net/AudiA6LV6/article/details/126954998