欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫网络请求模块urllib

程序员文章站 2022-05-03 19:58:38
...


基本概念

  • 客户端向服务器发起请求的两种方式
    • get 查询参数会在url显示出来,把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。传送的数据量较小,不能大于2KB,安全性非常低
    • post 查询参数是不会显示在url地址之上的。通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。传送的数据量较大,一般被默认为不受限制,安全性较高。
    • 如果没有加密,两种方式安全级别都是一样的,监听器都可以把所有的数据监听到。
  • url:统一资源定位符( uniform resource locator)
    https://new.qq.com/omn/TWF20200/TWF2020032502924000.html
    https: 协议
    new.qq.com : 主机名(域名) 省略了端口 443
    omn/TWF20200/TWF2020032502924000.html 访问资源的路径
    anchor : 锚点 前端用来做页面定位或者导航
  • User-Aagent :用户代理 记录了用户的操作系统、浏览器等,为了让用户更好的获取Html页面效果。很多网站都会根据User-Aagent做反爬处理,一般爬虫都需要添加User-Aagent。
    例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
    User-Agent通常格式:Mozilla/5.0 (平台) 引擎版本 浏览器版本号
    win10对应的就是Windows NT 10.0
  • Referer :表明当前的这个请求是从哪个url链接过来的。常常被用来统计用户来源,一般也可以作为一个反爬的方式。比如www.hao123.com

爬虫网络请求模块urllib

  • 使用原因
    • 一些老的爬虫项目用的是urllib
    • 有时爬取数据需要 urllib + requests
    • python内置库
    • urllib在某些方面比较强大

用urllib下载图片:

from urllib import request
url = 'https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3942751454,1089199356&fm=26&gp=0.jpg'
request.urlretrieve(url, 'code2.png')

爬取百度首页的时候,如果不加上User-Agent,不能拿到真正的首页信息

import urllib.request
url = 'https://www.baidu.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/87.0.4280.88 Safari/537.36 '
}
# 1.创建请求的对象(构建user-agent)
req = urllib.request.Request(url, headers=headers)
# 2.获取响应对象(urlopen)
res = urllib.request.urlopen(req)
# 3.读取响应对象的内容read().decode('utf-8')
html = res.read().decode('utf-8')
print(html)
print(res.getcode())  # 获取状态码 
print(res.geturl())  # url

url中的汉字转化为16进制

import urllib.parse
import urllib.request
base_url = 'https://www.baidu.com/s?'

key = input('请输入您要搜索的内容:')
wd = {'wd':key}
# urlencode() 传递一个字典,进行中文处理
key = urllib.parse.urlencode(wd)

url = base_url + key
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
# 保存文件
with open('搜索.html','w',encoding='utf-8') as f:
    f.write(html)