第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码

2023-11-13

Python要访问一个网页并读取网页内容非常简单,在利用《第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头》的方法构建了请求http报文的请求头情况下,使用urllib包的request模块使得这项工作变得非常容易,具体语句如下:

header = mkhead()
req = urllib.request.Request(url=site,headers=header)
sitetext = urllib.request.urlopen(req).read().decode()

urllib.request.Request和urllib.request.urlopen这2个语句也可以合并成一个句子,在此不详细介绍,相关说明请参考:
https://docs.python.org/3/library/urllib.request.html?highlight=request#module-urllib.request

说明:
1、 在国内decode的参数一般是缺省值、UTF-8、GBK这三种,如果是缺省值就是UTF-8;

2、 site就是要访问网站的网址;

3、 headers参数是http报文头的内容,请参考《第14.1节 通过Python爬取网页的学习步骤》或《第14.3节 使用google浏览器获取网站访问的http信息》介绍的有关http报文头的知识。实际设置时,报文头的内容可多可少,具体看爬虫访问网站的要求:

1)headers参数可以不传实参,也可以为空字典实参,不传实参系统缺省使用空字典,这种情况下Python处理时会自动补充一些内容以使web服务器能正确处理,这些值带有浓郁的Pythonic味道,可以使得服务端很容易知道这是Python代填充的,具体填充值大家可以使用抓包程序看一下。对于爬虫程序来说这不是很好的事情,因为爬虫最好是能伪装成正常的浏览器访问;

2)headers填写部分参数,老猿建议填写下列参数:
 User-Agent:这个是表明使用的哪个浏览器的,关于其来历可参考一下《转:为什么浏览器的user-agent字符串以’Mozilla’开头呢?》,具体取值网上可以查一下,最好办法是直接抓取真实浏览器的数据填入,如老猿直接使用本机浏览器的信息:

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
怎么抓取信息请见章节《第14.3节 使用google浏览器获取网站访问的http信息》、《第14.4节 使用IE浏览器获取网站访问的http信息》。

 Accept:这个是表明本机作为客户端浏览器可接受的MIME类型(互联网媒体类型),就是本机能识别处理的互联网信息类型,最好也从本机或其他真实的机器上抓取填入。如老猿抓取本机浏览器发送的请求信息中,填写的值为:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3’

 Accept-Encoding:浏览器能够支持的压缩编码方式,如gzip, deflate, br等,服务端的报文体的压缩格式在响应报文的报文头的Content-Encodin字段中记载。http请求时通过Accept-Encoding告知服务端本客户端能识别的压缩格式,服务端根据该字段及服务端的情况采用对应方式压缩http报文体。注意如果应用中没有考虑服务端http报文体的解压缩,则这个值不要设置,否则会导致应用无法识别收到的响应报文体。关于HTTP响应报文头的信息请参考《转:http协议学习系列(响应头—Response Headers)》;

 Accept-Language: 客户端浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到,如zh-CN,zh;q=0.9等;

 Connection:表示是否需要持久连接,keep-alive表示是持久连接;

 cookie:会话cookie信息,如果要复用已有浏览器会话不实现登录管理则可以直接复制已有浏览器会话的cookie,否则要么应用程序自己实现网站登录,要么就是匿名访问,具体大家可以根据自己爬虫应用的要求来确认处理方式。

以上信息老猿建议根据爬虫功能的需要设置,但User-Agent是必须设置,这样才能使得应用程序貌似一个正常的浏览器。

案例:下面是老猿访问自己博客文章的代码:

>>> import urllib.request
>>> def mkhead():
    header = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'Accept-Language':'zh-CN,zh;q=0.9',
    'Connection':'keep-alive',
    'Cookie':'uuid_tt_dd=10_35489889920-1563497330616-876822; ...... ',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
    return header

>>> url= r'https://blog.csdn.net/LaoYuanPython'
>>> header=mkhead()
>>> req = urllib.request.Request(url=url,headers=header)
>>> text = urllib.request.urlopen(req).read().decode()

>>> text[0:100]
'<!DOCTYPE html>\n<html lang="zh-CN">\n<head>\n    <meta charset="UTF-8">\n    <link rel="canonical" href'
>>> 

执行后,text中存放的就是要访问网页的内容,上述案例中显示了读取信息的前100个字符。

本节介绍了使用urllib包的request模块读取网页的实现过程,整体过程非常简单,读取了网页内容后就可以进行网页内容的解析。

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython

老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036
请大家多多支持,点赞、评论和加关注!谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码 的相关文章

  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 微信支付

    一 微信小程序支付开发步骤 1 统一下单 1 1 准备参数 接口链接 https api mch weixin qq com pay unifiedorder 需要参数 param string appid 小程序ID param stri
  • Spring源码解读(9)---解析配置类

    Spring源码解读 9 解析配置类 解析配置类 1 在启动Spring时 需要传入一个AppConfig class给ApplicationContext ApplicationContext会根据AppConfig类封装为一个BeanD
  • android布局之线性布局的属性用法

    1 gravity属性 gravity 用于设置该控件内容相对于该控件的相对对齐方式 layout gravity 用于设置该控件相对于父控件的相对对齐方式 举例
  • 计算机网络ld查找,查找电脑id_怎么查找电脑ip地址

    2016 12 08 15 07 59 查找电脑主机ID方法 方法一 开始 gt 所有程序 gt 附件 gt 命令提示符 gt 输入Systeminfo命令 gt 回车 等一会 找到 主机名 这一项 其后面显示 2016 11 21 16
  • tkinter比较常用的组件

    1 输入框组件 输入框 Entry 用来输入单行内容 可以方便地向程序传递用户参数 这里通过一个转换摄氏度和华氏度的小程序来演示该组件的使用 import tkinter as tk def btnHelloClicked cd float
  • win10安装配置IIS的教程

    win10安装配置IIS的教程 1 安装 在如下 win0菜单输入程序和功能 2 打开后的界面 并选择Internet Information Service 3 选择加号中以及红框中的所选定的所有内容 4 点击确定 5 接下来等待资源的安
  • Android Studio 期末大作业(英语app)[免费开源]

    先简要说明下 该大作业不包含数据存储 网络通信技术 仅是一个大致的框架 有兴趣的朋友可以在此基础上进行开发 资源链接在文末 人 大作业简介 这是一款英语学习APP 包含4个大模块 单词搜索 美文阅读 客服聊天 软件详情 每个模块都有详细的开
  • CentOS下安装好python和opencv,却import cv2失败

    在安装好CentOS和OpenCV后 在终端输入python 在输入import cv2 却报错 ImportError Mo module named cv2 浏览Python下文件夹发现cv2 so 原因是没有添加相应路径 解决办法 1
  • cookie及正则总结

    cookie及正则总结 cookie cookie是什么 cookie是存在浏览器上的一个只有4kb的容器 里面存储的类型为string 他会在每次http请求的时候 携带过去 他是为了解决http的无状态的特性 cookie的获取 doc
  • Java解析省市县树形结构工具类

    这篇博客将介绍如何根据6位行政编码 解析出省市县区等 adcode共6位 前俩位省 直辖市 自治区 前4位城市 6位区县 并优雅的树形结构输出省市 本文只解析了俩层 感兴趣的小伙伴可以自行解析区县 1 效果图 优雅的树形结构输出省市 22
  • 常见异常【一】TooManyResultsException

    org apache ibatis exceptions TooManyResultsException Expected one result or null to be returned by selectOne but found 1
  • Vercel和Railway都是云端的平台即服务提供商

    Vercel是一个专注于构建响应快速的现代网站和应用程序的服务平台 它被广泛用于构建静态网站 React应用程序等 Vercel提供全球CDN 构建和部署等强大的功能 支持多种前端框架 此外 Vercel还具有可扩展性 安全性和易用性 可以
  • Junit mock String authToken = request.getHeader(AUTH_TOKEN)

    单元测试 mock String authToken request getHeader AUTH TOKEN 代码示例 String authToken request getHeader AUTH TOKEN TEST示例 Mock M
  • 摸鱼,我是认真的

    苏生不惑第370 篇原创文章 将本公众号设为星标 第一时间看最新文章 今天分享几个有趣好玩的摸鱼网站 app 摸鱼 我是认真的 童年游戏博物馆 这个网站收录了各种童年记忆游戏 冒险岛 超级马里奥等 https www return8090
  • 港中文&商汤提出SMCA:用于DETR快速收敛的空间调制协同注意力

    为了加速DETR收敛 本文提出了一种简单而有效的方案来改进DETR框架 即空间调制协同注意 SMCA 机制 即插即用 让DETR涨点明显 性能优于可变形DETR DETR等网络 注1 文末附 Transformer 和 目标检测 交流群 注
  • VS2013+QT5.8.0配置

    一 安装 因为最近在看图形学的三维重构 需要学习meshlab的一些重建方法 官网找到了编译源码 需要编译 不得不学一下QT 先说说VS2013 QT的配置吧 系统环境 windows10 64bit VS 2013 QT5 8 0 QT5
  • Vue使用axios发送post请求,后端无法接收怎么处理?(Djnago后台)

    今天终于解决了一个困扰很久的问题 在使用Vue进行前端项目的搭建时 通常采用axios作为数据传输的工具 我们会发现 使用get请求一切都正常 但是使用post请求 会发生一些奇怪的事情 这次我使用的是python的web框架django
  • C#开发物联网实践(新手)之门槛

    ABP Cli安装问题 问题描述 想在VS2019上装CLI 输入 dotnet tool install g Volo Abp Cli 结果要求我下载VS2022 刚出的2022VS 我刚看完视频下载的VS2019 解决方法 下载国内版
  • vue教程

    原文 1 vue安装 1 1 直接用 script标签引入 对于制作原型或学习 你可以这样使用最新版本 对于生产环境 我们推荐链接到一个明确的版本号和构建文件 以避免新版本造成的不可预期的破坏 1 2 NPM创建 安装vue npm ins
  • 第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码

    Python要访问一个网页并读取网页内容非常简单 在利用 第14 5节 利用浏览器获取的http信息构造Python网页访问的http请求头 的方法构建了请求http报文的请求头情况下 使用urllib包的request模块使得这项工作变得