爬虫简单案例

以下案例仅做学习分享。

一、urllib库

        爬取有道在线翻译网站的内容(http://fanyi.youdao.***),输出爬取到的信息。

1、问题分析

        首先需要构造HTTP请求,然后将HTTP响应的各部分进行输出。

import urllib.request

url = 'http://fanyi.youdao.***'

# 构造HTTP请求,并将返回的结果赋值给response

#用该函数读取的网页内容为bytes类型,需要用decode函数解码。转化为str类型
response = urllib.request.urlopen(url)

print('响应类型:', type(response))
print('响应状态码:', response.getcode())

#输出编码方式
print('编码方式:', response.getheader('Content-Type'))
print('请求的URL: ', response.geturl())

#读取网页内容并解码
resp = response.read().decode('utf-8')
print('网页内容:\n', resp)
响应类型: <class 'http.client.HTTPResponse'>
响应状态码: 200
编码方式: text/html;charset=UTF-8 
请求的URL:  http://fanyi.youdao.***
网页内容:
 <!DOCTYPE html><html lang="" class="light"><head><meta charset="utf-8"><meta http-equiv="X-UA-***patible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="keywords" content="在线即时翻译、免费AI翻译、文档文本翻译、人工翻译、网页翻译."><meta name="description" content="有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越
南语、印尼语、意大利语、荷兰语、泰语全文翻译、网页翻译、文档翻译、PDF翻译、DOC翻译、PPT翻译、人工翻译、同传等服务。"><meta property="og:image" content="https://ydluna***mon-cdn.nosdn.127.***/322e3486ea5a517c2cba3b76864dadba.png"><link rel="icon" href="https://ydluna***mon-cdn.nosdn.127.***/31cf4b56e6c0b3af668aa079de1a898c.png"><script src="//bat.bing.***/bat.js" async=""></script><script src="//bat.bing.***/bat.js" async=""></script><script>(function (w, d, t, r, u) {

2、urllib库简介

        urllib库是python内置的标准库,不需要额外安装,它包含四个模块

  1. request:模拟发送HTTP请求。
  2. error:处理HTTP请求错误时的异常。
  3. parse:解析、拆分和合并URL。
  4. rebotparser:解析网站的robots.txt文件。

3、发送请求

        request模块提供了基本的构造HTTP请求的方式,同时它还可以处理授权验证、重定向、cookie会话及其他内容。

3.1、urlopen()函数

        urlopen函数可以构造基本的http请求,其函数原型如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, 
capath=None, cadefault=False, context=None)
  • url:请求的url。可以是一个表示url的字符串,也可以是一个request类型的对象。这是必传参数。
  • data:请求体信息(如在线翻译,在线答题等提交的内容)。data默认值是none,表示以get方式发送请求;当用户给出data参数时,表示以post方式发送请求。
  • timeout:单位为秒。
  • cafile、capath、cadefault:用于实现可信任CA证书的HTTP请求。了解就行。
  • context:实现SSL加密传输。了解就行。

        调用函数后,返回一个HTTPResponse类型的对象,该对象提供的方法和属性如下:

方法和属性 说明
getcode()/status 获取响应状态码
get_url() 获取请求的URL
getheaders() 获取响应头细腻些,返回二元组列表
getheaders(name) 获取特定响应头信息
info() 获取响应头信息,返回字符串
read()/readline() 读取响应体

        urlopen函数既可以实现get请求,又可以通过设置data参数实现post请求。

3.2 request函数

        当HTTP请求信息较复杂时,可用request函数进行设置,函数原型如下:

urllib.request.Request(
    url, 
    data=None, 
    headers={}, 
    origin_req_host=None, 
    unverifiable=False, 
    method=None
)
  • url:请求的URL
  • data:请求体信息,其使用方法与urlopen函数中的data参数相同
  • headers:请求头信息
  • origin_req_host:客户端的host名称或者IP地址
  • unverifiable:表示这个请求时无法验证的,在默认情况下设置为false
  • method:请求方法,如get、host

        调用该函数后,返回一个request类型的对象,然后通过urlopen函数构造完整的HTTP请求。当服务器有反爬虫机制时,可通过设置headers参数伪造成浏览器去访问网站。

import urllib.request

url = 'http://fanyi.youdao.***/'

#设置headersvalue参数,伪装成浏览器
headersvalue = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "A***ept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "A***ept-Language": "zh-***,zh;q=0.9"
}

#创建request对象,并将返回的结果赋值给request
request = urllib.request.Request(url, headers=headersvalue)

#构造HTTP请求,并将返回的结果赋值给response
response = urllib.request.urlopen(request)
resp = response.read().decode('utf-8')
print(resp)

3.3 处理异常

        error模块提供了request模块产生的异常处理方法,它主要包含了URLerror和HTTPerror两个类。

URL error类是error异常模块的基类,可以捕获request模块产生的异常,它具有一个request属性。

HTTPerror类是URLerror的子类,专门处理HTTP请求的异常,它具有三个属性,分别为reason、code、headers。

        因为HTTPerror是URLerror的子类,并不能处理父类支持的异常处理,所以一般对两种异常分开捕获,可先捕获子类的异常,才捕获父类的异常。

爬取一个不存在的网站内容,输出异常

import urllib.request
import urllib.error

try:
    # 故意访问不存在的路径
    response = urllib.request.urlopen('http://fanyi.youdao.***/nonexist-api', timeout=5)
except urllib.error.HTTPError as e:
    print('[HTTP错误]')
    print('状态码:', e.code)          # 输出 404
    print('错误原因:', e.reason)      # 输出 "Not Found"
    print('响应头:', e.headers)       # 查看服务器返回的Headers
except urllib.error.URLError as e:
    print('[URL错误]')
    print('错误原因:', e.reason)      # 如超时、DNS解析失败等
else:
    print('请求成功')

4 解析URL

        parse模块提供了解析URL的方法,包括url的拆分、合并和转换

拆分:

  • urlparse(urlstring):将URL拆分为六个部分,分别是scheme、***loc、path、params、query、fragment
  • urlsplit(urlstring):将url拆分为五个部门,分别是scheme、***loc、path、query、fragment

合并:

  • urlunparse():将 6 组件元组合并为完整 URL
  • urljoin():将相对 URL 转换为绝对 URL

转换:

  • urlencode():字典 → 查询字符串(支持 doseq 处理列表)
  • parse_qs():查询字符串 → 字典(值自动转为列表)
  • parse_qsl():查询字符串 → 键值对列表
  • quote():对字符串进行 URL 编码(空格→%20
  • unquote():解码 URL 编码字符串

转载请说明出处内容投诉
CSS教程网 » 爬虫简单案例

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买