• python爬虫学习笔记(1)


    一、请求一个网页内容打印

      爬取某个网页:

     1 from urllib import request
     2 # 需要爬取的网页
     3 url = "https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9085796282359478067%22%7D&n_type=0&p_from=1"
     4 # 打开网页,并返回
     5 rsp = request.urlopen(url)
     6 # 读取返回的结果
     7 html = rsp.read()
     8 # 由于rsp返回的是流文件需要解码
     9 html = html.decode()
    10 printf(html)

      爬取一个网页的基本流程:

        1、获取所需网页request.urlopen("网页链接")

        2、读取返回页面 rsp.read()

        3、解码:html.decode()

    二、自动识别网页编码

     1 from urllib import request
     2 import chardet
     3 url = "https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9085796282359478067%22%7D&n_type=0&p_from=1" 
     4 res = request.urlopen(url)
     5 html = res.read()
     6 # 检查编码
     7 cs =  chardet.detect(html)
     8 # 编码设置
     9 html = html.decode(cs.get("encoding",  "utf-8"))
    10 print(html)

      第7行返回一个类似{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}的字典   encoding是编码格式,confidence是前面编码格式的概率。第九行进行解码设置,如果有匹配的编码按照获取的方式进行解码,否则按照“utf-8”的方式解码。

    三、到百度页面爬取指定内容

     1 from urllib import request, parse
     2 if __name__ =='__main__':
     3     url = "http://www.baidu.com/s?"
     4     # 输入关键词
     5     wd = input("Input keyword:")
     6     # 把关键字以字典保存
     7     qs = {
     8            "wd":wd          
     9     }
    10     # 把关键字进行编码
    11     qs = parse.urlencode(qs)
    12     # 拼凑成完整的url
    13     fullurl = url + qs
    14     res = request.urlopen(fullurl)
    15     html = res.read().decode()
    16     print(html)

    四、进行百度翻译:

      解析:

        1、打开F12

        2、尝试输入单词,发现每输入一个字母都有请求

        3、找到请求的地址:https://fanyi.baidu.com/sug

        4、在NetWork-All-Headers中查看,发现FormData的关键字是 kw:单词

        

      5、打开sug文件发现数据时json格式

      方式一:

     1 from urllib import request, parse
     2 import json
     3 baseurl = "https://fanyi.baidu.com/sug"
     4 word = input("请输入单词: ")
     5 data = {
     6    "kw":word 
     7 } 
     8 # 对单词进行编码
     9 data = parse.urlencode(data).encode()
    10 # 构建请求头
    11 rsp = request.urlopen(baseurl, data = data)
    12 json_data = rsp.read().decode()
    13 # 由于返回的是json数据,转换成字典
    14 json_data = json.loads(json_data)
    15 for item in json_data['data']:
    16     print(item['k'], item['v'])

       翻译流程:

        1、利用data构造内容,然后用URLopen打开

        2、返回一个json格式

        3、转换成字典,输出

      方式二:

     1 from urllib import request, parse
     2 import json
     3 baseurl = "https://fanyi.baidu.com/sug"
     4 word = input("请输入单词:")
     5 data = {
     6      "kw": word      
     7 }
     8 data = parse.urlencode(data).encode('utf-8')
     9 headers = {
    10            'Content-Length':len(data)    
    11 }
    12 req = request.Request(url = baseurl, data = data, headers = headers)
    13 res = request.urlopen(req)
    14 json_data = res.read().decode()
    15 json_data = json.loads(json_data)
    16 for item in json_data['data']:
    17     print(item['k'], item['v])

    五、urllib.error

      在某些时候爬取网站出现问题,可以通过 URLError和HTTPError查找问题

      1、URLError产生原因

        - 没网

        - 没有指定服务器

        - 服务器连接失败

     1 from urllib import request, error
     2 if __name__ == '__main__':
     3     url = "http://www.baidu.com"
     4     try:
     5         req = request.Request(url)
     6         res = request.urlopen(req)
     7         html = res.read().decode()
     8     except error.URLError as e:
     9         print("URLError: {0}".format(e.reason))
    10     except Exception as e:
    11         print(e)

      2、HTTPError

        HTTPError一般对应HTTP请求的返回码错误,如果返回的错误码是400以上引发HTTPError

        与URLError的关系:

          OSError  -> URLError  -> HTTPError

        代码:

     1 from urllib  import request, error
     2 if __name__ == '__main__':
     3     url = "http://www.baidu.com"
     4     try
     5         req = request.Request(url)
     6         res = request.urlopen(req)
     7         html = res.read().decode()
     8     except error.HTTPError as e:
     9         print ("URLError: {0}".format(e.reason))
    10         print ("HTTPError: {0}".format(e))
    11     except error.URLError as e:
    12         print ("URLError: {0}".format(e.reason))
    13         print ("HTTPError: {0}".format(e))
    14     except Exception as e:
    15         print(e)

     

  • 相关阅读:
    Chrome浏览器网页截全屏算法以及实现
    去除scons构建动态库的前缀lib
    Javascript的继承
    win7 VS2008 ffmpeg release 版本崩溃 0x00905a4d 处未处理的异常
    shell脚本获取随机数random
    iOS navigationbar添加实现
    TableView中改变Button按钮状态
    将TableView的中的Label和Cell行数绑定
    build diff: /../Podfile.lock: No such file or directory
    initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.14-kali1-amd64 mktemp: failed to create directory via template `/var/tmp/mki
  • 原文地址:https://www.cnblogs.com/MoonlightMaleGod/p/9623550.html
Copyright © 2020-2023  润新知