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)

 

原文地址:https://www.cnblogs.com/MoonlightMaleGod/p/9623550.html