一、两个Error:HTTPError、URLError
(1)HTTPError包含URLError
(2)HTTPError:
当URL地址为:网站存在,但是具体的网页不存在时,返回404,报错HTTPError
(3)URLError:
当URL地址为:完全没有这个网站时,就会报URLError
如:www.fsdfdsfdsfsd.com
(4)解决方法:使用异常处理
4.1 HTTPError:
try:
request = urllib.request.ulropen(url)
except urllib.error.HTTPError as error:
#打印具体错误信息
print(error)
#打印具体错误代码
print(error.code)
4.2 URLError:
try:
request = urllib.request.ulropen(url)
except urllib.request.URLError as error:
print(error)
二、requests模块:
(1)请求头、响应头:
1 import requests 2 3 4 class RequestSpider(Object): 5 def __init__(self): 6 url = "http://www.baidu.com/" 7 8 #请求头 9 headers = {"User-Agent": "xxx"} 10 11 #发送网络请求 12 self.response = requests.get(url, headers=headers) 13 14 def run(self): 15 #1. 获取请求头 16 #该方法获取的是,之前添加的请求头的信息 17 #如果之前没有添加请求头,则requests模块会自动给加上一个请求头,如:python-requests/2.20.0 18 request_header = self.response.request.headers 19 20 #2. 获取响应头 21 response_header = self.response.headers 22 23 #3. 获取响应头的状态码 24 response_code = self.response.status_code 25 26 #4. 获取请求头的cookie(有些请求头不需要cookie) 27 #注意_cookie之前多了一个下划线 28 request_cookie = self.response.request._cookie 29 30 #5. 获取响应头的cookie 31 response_cookie = self.response.cookies 32
(2)会自动将中文转译为ASCII码格式:
爬取百度首页搜索“美女”关键词结果
https://www.baidu.com/s?wd=美女
2.1 使用原生urllib:
1 import urllib.request
2 import urllib.parse
3
4 fixed_url = "www.baidu.com/s?wd="
5
6 params = {"wd": "美女"}
7
8 complete_url = fixed_url + params["wd"]
9
10 #由于url,"www.baidu.com/s?wd=美女"中含有中文,所以需要转译为ASCII码
11 final_url = urllib.parse.quote(complete_url)
12
13 #发送网络请求
14 response = urllib.request.urlopen(url)
2.2 使用requests模块:
1 import requests
2
3 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"}
4
5 fixed_url = "www.baidu.com/s?wd="
6
7 params = {"wd": "美女"}
8
9 #requests模块,会自动将URL中的中文转译
10 #发送get网络请求
11 response = requests.get(url, params=params, headers=headers)
三、json数据:
理论:
HTML:用于写网页,显示数据
json:数据格式,数据量最小的格式(对比XML格式,数据量小)
XML:数据格式,数据量大,xml是json的前身
有时访问一个URL地址,服务器有可能会直接返回一个json格式数据
四、发送post请求:
requests.post(url, data=None, json=None)
——如何验证网页请求成功?
——请求状态码:response.status_code()
——除了200之外,都有问题
五、证书问题:
Q:如何忽略证书?
A:将get()方法中的参数verify=False
eg:
requests.get(url, headers=headers, verify=False)
六、使用免费代理IP
1 free_proxy = {"协议": "IP地址: 端口号"}
2
3 requests.get(url=url, headers=headers, proxies=free_proxy)