python3爬虫(1)--urllib请求库使用

环境:python3

urllib库

语法:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

注意:data参数,当给这个参数赋值时,HTTP的请求就使用POST方法,如果data=None或者不写,则使用get方法。

1、url库他是python内置的HTTP请求库,他主要包含4个模块

  • request: 最基本的HTTP请求模块,可以用来模拟发送请求。只需要传入URL和额外参数,就可以模拟实现这个过程
  • import urllib.request
    url="https://me.csdn.net/column/weixin_41685388"
    response = urllib.request.urlopen(url)
    print(response.read().decode('utf-8'))  
    # read()获取响应体的内容,内容是bytes字节流,需要转换成字符串
  • error:异常处理模块。
  • parse:一个工具模块提供了很多URL的处理方法,如:拆分、解析、合并、格式转换等。
  • robotparser:主要用于识别网站的robots.txt文件,判断哪些链接可以爬。很少使用

2、第一个简单的get请求

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
url="https://me.csdn.net/column/weixin_41685388"
response = urllib.request.urlopen(url)
print(type(response)) #输出:<class 'http.client.HTTPResponse'>
# 一个HTTPResponse类型的对象,
# 主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,
# 以及msg、version、status、reason、debuglevel、closed等属性。

# 常用status属性得到返回结果的状态码
print(response.status)  #返回200 表示正常请求

# getheaders()返回头部信息
print(response.getheaders())

# 返回头部信息中'Server'的值,服务器的搭建相关信息
print(response.getheader('Server'))

# 常用.read().decode('utf-8')返回网页内容,read()获取响应体的内容,内容是bytes字节流,需要转换成字符串
print(response.read().decode('utf-8'))  #网页内容

3、如何判断是get请求和post请求

问题来了,如何判断是get请求和post请求,谷歌浏览器为例:打开网页-->右击,检查(N)-->Network-->F5刷新,找到我们需要的Name,Method的值一看就知道了,注意往往第一次使用的时候检查功能的时候默认没有打开Method,需手动勾选一下

get请求,如:https://blog.csdn.net/weixin_41685388/category_9426224.html链接

如何查看是否是我们需要的Name?

请求时需要的内容:

来一个post请求,看长啥样如:http://fanyi.youdao.com/

请求时需要的内容:具体看4中代码

4、post请求表单的提交

在使用urllib.request.urlopen()函数有一个data参数,当给这个参数赋值时,HTTP的请求就使用POST方法,如果data=None或者不写,则HTTP的请求就使用get方法。data参数的格式必须符合application/x-www-form-urlencoded的格式。需要urllib.parse.urlencode()将字符串转化为这个格式。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
import urllib.parse
import json
import time

def youdao(input):
    #url=r"http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    # 调试后发现设置了反爬机制,需要将“_o”删除即可。
    url=r"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    #用于隐藏身份,Headers必须是字典,在网页检查的Request Headers中,常调用Cookie和User-Agent,
    # 使用urllib.request.Request()才能调用该功能。
    Headers = { } 
    Headers["Cookie"]=r'OUTFOX_SEARCH_USER_ID_NCOO=1564612197.2237918; OUTFOX_SEARCH_USER_ID="[email protected]"; _ga=GA1.2.269278628.1571982437; _ntes_nnid=db62add68d78e9de1c202b8b131b32a4,1579175684866; JSESSIONID=aaaGcKLB2j8UhdX6Q3V_w; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1579203741289'
    Headers["User-Agent"]=r"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
    data = { } #post请求需要的data参数,在网页检查的Form Data中,
    #data["i"]="I am jalen" #认真一点你会发现这就是我们输入的值,自己做一个简单的有道翻译只需要修改这里就可以实现
    data["i"] = input  #那就按照习惯在函数外单独输入经常变化的值
    data["from"]="AUTO"
    data["to"]="AUTO"
    data["smartresult"]="dict"
    data["client"]="fanyideskweb"
    data["salt"]="15792037412906"
    data["sign"]="324404ee89ccb63c2ea1efb7d311db26"
    data["ts"]="1579203741290"
    data["bv"]="74b3450c611e373bdb05dc0a4ecdedd0"
    data["doctype"]="json"
    data["version"]="2.1"
    data["keyfrom"]="fanyi.web"
    data["action"]="FY_BY_CLICKBUTTION"
    data = urllib.parse.urlencode(data).encode("utf-8") #post请求的data参数格式转化
    req =  urllib.request.Request(url,data,Headers)
    response = urllib.request.urlopen(req,timeout=30)
    html = response.read().decode("utf-8")  #返回网页内容
    # print(type(html),html)  #后面就可以解析了,解析部分在后面的文章中有单独讲解,但这里还是继续写完本例

    target = json.loads(html)  #json解析后面的文章会单独讲解
    print("翻译结果:%s" % (target['translateResult'][0][0]['tgt']))
    # 翻译结果:我是罗斯

if __name__ == '__main__':
    input = "I am jalen"
    time.sleep(5)  #延时提交
    youdao(input)

5、隐藏、请求超时、延时提交

在4中得代码中已经有体现了,简单的回顾一下:

(1)隐藏:隐藏身份,Headers必须是字典,在网页检查的Request Headers中,常调用和修改Cookie和User-Agent,使用urllib.request.Request()才能调用该功能。如:req = urllib.request.Request(url,data,Headers)

(2)请求超时:在设定的时间范围内如果网页没有成功请求,则返回错误如:response = urllib.request.urlopen(req,timeout=0.3)

(3)延时提交:time.sleep(n) ,n表示秒数

以上是urllib请求库的基本使用,其他内容包括requests请求库、json解析、beautiful soup、异常处理、代理ip等在后面的文章中。

发布了103 篇原创文章 · 获赞 75 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41685388/article/details/104009479
今日推荐