当前位置:

的爬虫程序

访客 2024-04-23 1349 0

目录扒网页urllib的基本使用requset.urlopen(url,data,timeout)response.read()response.getcode()response.geturl()response.info()request对象的使用发送请求/响应header头的含义:urllib发送get请求注意:

扒网页

其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加JS、CSS。如果把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。所以最重要的部分是存在于HTML

  • HTML70%
  • JS20%
  • CSS10%

扒取页面的代码如下:

  • fromurllib.requestimporturlopen
  • #请求的地址
  • url='http://www.百度.com/'
  • #发送请求
  • resp=urlopen(url)
  • #打印响应结果
  • print(resp.read().decode()[:1000])
  • 注意

    urllib模块库是python自带的。在Python2叫urllib2

    这里真正的程序就两行,这个网页的码源就被扒下来了。(当然这里抓取了前1000个,太多了不展示了)

    urllib的基本使用

    requset.urlopen(url,data,timeout)

    其中第一个参数url即为URL,是必须要传送的,

    第二个参数为data是访问url时要传送的数据,

    第三个参数timeout是设置超时时间。

    第二三个参数是可以不传送的,data默认为空None,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT

    response.read()

    read()方法就是读取文件里的全部内容,返回bytes类型

    response.getcode()

    返回HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题

    response.geturl()

    返回返回实际数据的实际URL,防止重定向问题

    response.info()

    返回服务器响应的HTTP报头

  • fromurllib.requestimporturlopen
  • #定义发送的位置
  • url='http://www.百度.com/'
  • #发送请求
  • resp=urlopen(url)
  • #打印响应的数据
  • print(resp.read()[:100])
  • #获取响应码
  • print(resp.getcode())
  • #获取访问的url
  • print(resp.geturl())
  • #获取响应头信息
  • print(resp.info())
  • 获取结果:

    request对象的使用

    使用urllib.request.urlopen发送请求时,可以将参数封装到一个Request对象中。

    参数包含:

    • url发送的请求链接
    • headers请求头信息
    • data请求数据

    使用request对象进行封装参数,可以很好的进行伪装,为什么要伪装?看下图:

    我们可以看到我们的User-Agent为python-urllib/3.9,这别人一看这个软件环境就知道是程序在访问他的网站,所以说我们得伪装自己称浏览器,那么怎么获取自己的User-Agent呢。

    有两种方法:

    再通过request来对其进行封装就可以实现伪装浏览器访问的效果。

    代码如下:

  • fromurllib.requestimporturlopen
  • fromurllib.requestimportRequest
  • #url='http://www.百度.com/'
  • url='http://httpbin.org/get'
  • #定义headers信息
  • headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/92.0.4515.131Safari/537.36SLBrowser/8.0.0.12022SLBChan/103'}
  • #创建Request对象
  • req=Request(url,headers=headers)
  • #发送请求
  • resp=urlopen(req)
  • #打印响应结果
  • print(resp.read().decode())
  • 效果:

    发送请求/响应header头的含义:

    名称含义
    Accept告诉服务器,客户端支持的数据类型
    Accept-Charset告诉服务器,客户端采用的编码
    Accept-Encoding告诉服务器,客户机支持的数据压缩格式
    Accept-Language告诉服务器,客户机的语言环境
    Host客户机通过这个头告诉服务器,想访问的主机名
    If-Modified-Since客户机通过这个头告诉服务器,资源的缓存时间
    Referer客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
    User-Agent客户机通过这个头告诉服务器,客户机的软件环境
    Cookie客户机通过这个头告诉服务器,可以向服务器带数据
    Refresh服务器通过这个头,告诉浏览器隔多长时间刷新一次
    Content-Type服务器通过这个头,回送数据的类型
    Content-Language服务器通过这个头,告诉服务器的语言环境
    Server服务器通过这个头,告诉浏览器服务器的类型
    Content-Encoding服务器通过这个头,告诉浏览器数据采用的压缩格式
    Content-Length服务器通过这个头,告诉浏览器回送数据的长度

    urllib发送get请求

    为什么要发送get请求?这是因为我们在浏览器中输入一个url地址访问的时就是get请求。

    大部分被传输到浏览器的HTML,images,js,css等都是通过get方法发送请求的。它是获取数据的主要方法。

    注意:

    GET请求发送参数时需要转码才可以使用。

    转码的两种方法:

    1.quote:转化一个值

    2.urlencode:转化键值对

    这是转化一个值的代码(键值对只需修改一点点即可):

  • fromurllib.requestimportRequest,urlopen
  • fromurllib.parseimportquote
  • #url的参数里不能有中文
  • args='python爬虫'
  • url=f'https://www.百度.com/s?wd={quote(args)}'
  • headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/92.0.4515.131Safari/537.36SLBrowser/8.0.0.12022SLBChan/103'}
  • req=Request(url,headers=headers)
  • resp=urlopen(req)
  • print(resp.read().decode()[:1500])
  • 发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~