(一)关于爬虫之请求
核心思想:
爬虫实际上是在想尽办法冒充客户端(如:浏览器)向服务器发起请求,拿到服务器响应的数据(资源)。这里都是以浏览器作为客户端发起请求。
用到的模块以及框架(使用前请先安装好):
1.requests
使用requests进行简单的爬取
import requests
requests的方法很多,这里主要使用到
requests.request(method, url, **kwargs),
requests.get(url, data=None, **kwargs),
requests.post(url, data=None, json=None, **kwargs)
method:请求方法,传参字符串形式,包括’‘GET’’, ‘‘OPTIONS’’, ‘‘HEAD’’, ‘‘POST’’, ‘‘PUT’’, ‘‘PATCH’’,’‘DELETE’’。
url:请求地址,即要爬取的网页的网址,字符串形式传参,如:https://www.baidu.com/
**kwargs:包括params(get请求的请求参数),data(post请求的请求参数),json(请求体中的json数据),headers(请求头),cookies,timeout等等,使用关键字传参
简单的爬取百度图片
import requests
import uuid
import os
import re
def image_download(url):
# 拿到百度图片搜索结果的页面-->https://visualhunt.com/popular/?scolor=Blue
resp = requests.request(url=url,method='GET')
# 使用正则把每张图片的地址筛选出来,其中resp.text得到的是"https://visualhunt.com/popular/?scolor=Blue"整个页面的代码文本
a = re.findall(r'https://.*?\.jpg',resp.text)
# 返回的a是所有图片的地址(url),a个是列表-->[url1,url2,...]
for x in a:
# 再对每一张图片的url发起请求返回一个response对象
res = requests.request(url=x,method='GET')
with open(f'壁纸/{uuid.uuid4()}{os.path.splitext(res.url)[-1]}', 'bw') as f:
# res.content返回的是字节数据,将该字节数据写入本地文件,图片就在磁盘中保存成功啦
f.write(res.content)
if __name__ == '__main__':
image_download('https://visualhunt.com/popular/?scolor=Blue')
2.urllib
urllib相比requests要麻烦一点
from urllib.request import urlopen
使用urlopen()发起请求,得到一个类文件响应对象–>http.client.HTTPResponse类对象
urlopen()的参数:
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None)
- 一般只用到url,data,timeout。
- timeout指超时时间,超过指定的时间没有请求到则结束请求,单位为秒,如:timeout=120。
- url是请求地址(字符串)或请求对象(response)。
- data如果不为空,则默认是post请求,data是请求参数,但必须要经过url编码;如果data为空,则默认是get请求。其余的参数可以去查看源码或文档
- urlopen()响应对象常用的方法和属性:此处以resp为响应对象
- resp.read(),返回响应资源的字节数据
- resp.geturl(),返回请求路径
- resp.info(),返回远程服务器返回的响应头信息,属于httplib.HTTPMessage类
- resp.headers,返回响应头,是一个ht