Python3网络爬虫教程2——urlopen的返回对象

Python3网络爬虫教程2——urlopen的返回对象上接:Python3网络爬虫教程1——初始爬虫(爬虫是干嘛的?)https://blog.csdn.net/u011318077/article/details/865088722.3.urlopen的返回对象rsp=request.urlopen(url)有时候不一定能获得对象,断网了,服务器故障等等geturl:返回请求对象的URLinfo:返回反馈对象的meta信息…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Python 全栈工程师核心面试 300 问深入解析(2020 版)—-全文预览

Python 全栈工程师核心面试 300 问深入解析(2020 版)—-欢迎订阅

上接:Python3网络爬虫教程1——初始爬虫(爬虫是干嘛的?)
https://blog.csdn.net/u011318077/article/details/86508872

2.3. urlopen的返回对象

  • rsp = request.urlopen(url)
  • 有时候不一定能获得对象,断网了,服务器故障等等
  • geturl: 返回请求对象的URL
  • info: 返回反馈对象的meta信息
  • getcode: 返回的http code(状态码)
  • 看实例43_3
# chardet
# 自动检测URL编码

import chardet
from urllib import request

if __name__ == '__main__':
    url = 'http://china.chinadaily.com.cn/a/201901/15/WS5c3d510fa31010568bdc3902.html'
    # 打开一个URL然后返回页面的内容
    rsp = request.urlopen(url)
    # 把返回的结果读取出来
    print(type(rsp))
    print("URL: {0}".format(rsp.geturl()))
    print("Info: {0}".format(rsp.info()))
    print("Code: {0}".format(rsp.getcode()))

Jetbrains全家桶1年46,售后保障稳定

2.4. request.data

  • 访问网络的两种方法
    • get
      • 利用参数给服务器传递信息
      • 参数为dict,使用parse编码
      • 看实例43_4
from urllib import request, parse

if __name__ == '__main__':

    # 百度搜索请求头信息
    url = 'http://www.baidu.com/s?'
    wd = input('Input your keyword: ')

    # 要想使用data,需使用字典结构
    qs = {'wd': wd}

    # 将输入的字典qs转换为url编码
    # 可以将打印出来的和百度搜索访问结果图片43_4中进行对比,发现url编码是一样的
    qs = parse.urlencode(qs)
    print(qs)

    fullurl = url + qs
    print(fullurl)

    # 访问的网址必须转换为url编码,直接访问会报错
    # fullurl = 'http://www.baidu.com/s?wd=大熊猫'
    rsp = request.urlopen(fullurl)

    html = rsp.read()
    html= html.decode()
    print(html)
- post
    - 一般向服务器传递参数使用
    - post是把信息自动加密处理
    - 我们如果想使用post信息,需要使用data参数
    - 使用post,意味着http请求头可能需要更改:
        - Content-Type: application/x-www.form-urlencode
        - Content-Length: 数据长度
        - 简而言之,一旦更改请求方法,注意其它请求头部信息相适应         
        - 看实例43_5/6
        - 为了更多的设置请求信息,单纯通过urlopen就不太适用了
        - 需要使用request.Request类

43-5

# 本案例用request.urlopen实现
# 更多的设置请求信息需要使用request.Request类,参考43_6

"""
利用parse模块模拟post请求
分析百度词典,参考图片43_5
分析步骤:
1. 打开网页检查(F12),输入单次girl,
2. 一个字母一个字母的输入,每输入一个字母,都会发生一次请求
3. headers采用name排序,会看见有四个sug,发生了四次请求
4. 查看headers里面的FormData的值是kw:girl
5. 检查返回的内容content-type是json格式,需要用到json包
"""
"""
大致流程:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的内容
3. 结果就应该是girl的释义
"""

from urllib import request, parse
import json

baseurl = 'https://fanyi.baidu.com/sug'

# 存储用来模拟formdata的数据一定是字典格式
wd = input('Input your keyword: ')
data = {'kw': wd}

# 需要对data进行编码
data = parse.urlencode(data).encode('utf-8')
print(type(data))
print(data)

# 有了data和url就可以尝试发出请求了,获取网页的内容
rsp = request.urlopen(baseurl, data=data)
json_data = rsp.read().decode('utf-8')
print(type(json_data))
print(json_data)

# 把json的原始字符串数据形式转换成python可编写的字典格式
# 对比上面和下面的打印结果的区别
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)

# 查看结果是一个字典,取出字典中键data对应的值是一个列表,
# 列表中又是有多个字典,每个字典中有两个键值对,将两个值取出,一一对应
for item in json_data['data']:
    # print(item)
    print(item['k'], "-----", item['v'])

43-6

# 本案例用request.Request类实现
# 对比43_5案例

"""
利用parse模块模拟post请求
分析百度词典,参考图片43_5
分析步骤:
1. 打开网页检查(F12),输入单次girl,
2. 一个字母一个字母的输入,每输入一个字母,都会发生一次请求
3. headers采用name排序,会看见有四个sug,发生了四次请求
4. 查看headers里面的FormData的值是kw:girl
5. 检查返回的内容content-type是json格式,需要用到json包
"""
"""
大致流程:
1. 利用Request请求内容(可以进行大量的请求),然后urlopen打开
2. 返回一个json格式的内容
3. 结果就应该是girl的释义
"""

from urllib import request, parse
import json

baseurl = 'https://fanyi.baidu.com/sug'

# 存储用来模拟formdata的数据一定是字典格式
wd = input('Input your keyword: ')
data = {'kw': wd}

# 需要对data进行编码
data = parse.urlencode(data).encode('utf-8')

# 我们需要构造一个请求头,请求头至少包含数据的长度
# request要求传入的请求头是一个dict格式
headers = {'Content-Length': len(data)}

# 构造一个Request类的实例,可以ctrl然后右键查看Request类的源代码
req = request.Request(url=baseurl, data=data, headers=headers)

# 已经构造了一个Request类的实例,然后用urlopen打开
rsp = request.urlopen(req)
json_data = rsp.read().decode('utf-8')

# 把json的原始字符串数据形式转换成python可编写的字典格式
json_data = json.loads(json_data)

# 查看结果是一个字典,取出字典中键data对应的值是一个列表,
# 列表中又是有多个字典,每个字典中有两个键值对,将两个值取出,一一对应
for item in json_data['data']:
    # print(item)
    print(item['k'], "-----", item['v'])

下接:Python3网络爬虫教程3——urllib.error的使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234478.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • django分页器的用法_SQL分页

    django分页器的用法_SQL分页前言当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面PageNumberPagination:基础分页器,性能略差LimitOffsetP

  • Spark Streaming Join「建议收藏」

    Spark Streaming Join「建议收藏」多数据源Join思路多数据源Join大致有以下三种思路:数据源端Join,如Android/IOS客户端在上报用户行为数据时就获取并带上用户基础信息。计算引擎上Join,如用SparkStreaming、Flink做Join。结果端Join,如用HBase/ES做Join,Join键做Rowkey/_id,各字段分别写入列簇、列或field。三种思路各有优劣,使用时注意…

  • CTF misc之流量分析题套路总结[通俗易懂]

    CTF misc之流量分析题套路总结[通俗易懂]1.前言昨天去I春秋刷了几题流量分析题,然后总结了一下流量分析题的做题方法。2.刷题2.1可恶的黑客步骤一、HTTP追踪流先了解进行什么操作可以看到是传了webshell然后进行文件操作套路1:一般是传webshell然后菜刀连接,参数进行base64位加密,先解密参数,了解进行了什么操作一步步解密请求参数了解进行什么操作这个是传webshell里

  • 物联网服务器_物联网接口

    物联网服务器_物联网接口一、第一次上线本主机于2018年12月23日正式上线,初装了4个设备,管理474只表,由于是手抄改网络抄表不是新安装,考虑到人工再去布线的成本远高于设备成本,因此多用了几个设备,每个设备通道都没有用完。1、设备号为663183的设备在安装后有一个通道在抄读水表的时候有短路发生,那是因为…

  • 数仓分层(ODS、DWD、DWS、DWT、ADS)和数仓建模

    数仓分层(ODS、DWD、DWS、DWT、ADS)和数仓建模文章目录一、数仓分层数仓概念ODS(原始数据层)做了哪些事DWD(明细数据层)做了哪些事DWS(服务数据层)做了哪些事DWT(主题数据层)做了哪些事ADS(应用数据层)做了哪些事二、数仓建模常用的建模工具ODS层DWD层DWS层DWT层ADS层一、数仓分层数仓概念什么是数仓:数据仓库是为企业所有决策制定过程,提供所有系统数据支持的战略集合。通过对数据仓库中数据的分析,可以帮助企业改进业务流程、控制成本、提高产品质量等。数据仓库并不是数据的最终目的地,而是为数据最终的目的地做好准备。这些准

  • android遍历的方法,android中遍历arrayList的四种方法

    android遍历的方法,android中遍历arrayList的四种方法一.在android中遍历arrayList有以下四种方法:1.实例:packagecom.mylist.test;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassArrayListDemo{publicstaticvoidmain(Stringargs[])…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号