一. requests.Session()
上一篇总结爬虫的文章里,有说道一个cookie的问题。当时我都是手动解析,手动添加的。后来才知道requests模块居然有一个Session功能,可以保持cookie。这里记录一下:
import requestsbase_url = 'https://www.zhihu.com'# 未登录装态r_session = requests.Session()r_session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'zhihu = r_session.get(base_url)print(zhihu.request.headers)# 登录data = { 'username': 'username', 'password': 'password'}zhihu_sign_in = r_session.post('https://www.zhihu.com/api/v3/oauth/sign_in', data=data)print(zhihu_sign_in.request.headers)复制代码
结果:
用了Session就会自动带上cookie了。
二. 如何下载一个图片
-
urlretrieve
在Python自带的模块urllib中提供了一个方法urlretrieve,可以用这个方法下载一个图片:
from urllib.request import urlretrieveimport osimg_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'urlretrieve(img_url, './image.jpg')复制代码
传入图片地址和图片要存放的地址即可。
-
requests模块
import requestsimg_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'img = requests.get(img_url)with open('./image2.jpg', 'wb') as f: f.write(img.content)复制代码
使用requests模块也可以下载图片,通过open方法将下载下来的图片通过二进制方式写入文件中
如果下载的图片(除了图片其他资源也一样,比如视频)特别大,那么还可以用
import requestsimg_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'img = requests.get(img_url, stream=True)with open('./image3.jpg', 'wb') as f: for chunk in img.iter_content(chunk_size=10): f.write(chunk)复制代码
这种方式,加上steam=True参数,可以让requests下载一点保存一点,而不是等全部下载完成再进行保存,然后通过chunk_size控制chunk的大小
-
实现一个下载壁纸的爬虫
import requestsimport timeimport randomfrom bs4 import BeautifulSoupimport osfrom functools import reducebase_url = 'https://alpha.wallhaven.cc/' # 壁纸网址req_session = requests.Session()req_session.headers['user-agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'def get_store_path(dir_name): ''' 创建存放壁纸文件目录 ''' current_path = os.path.abspath('.') target_path = os.path.join(current_path, 'wallpaper/%s' % dir_name) folder = os.path.exists(target_path) if not folder: os.makedirs(target_path) return target_pathdef get_img_html(page_size): ''' 获取壁纸的html资源 ''' htmls = [] for i in range(1, page_size): params = { 'q': keyword, } # 由于该网站page是从2开始的,如果带了小于2的值就会找不到壁纸 if i >= 2: params['page'] = i html = req_session.get('%s/search' % base_url, params=params) htmls.append(html) time.sleep(random.random()) return htmlsdef parse_html(html): ''' 从html中将壁纸地址解析出来 ''' imgs_src = [] bs_html = BeautifulSoup(html.text, 'lxml') img_tags = bs_html.find_all('img', { 'class': 'lazyload'}) if len(img_tags): for img in img_tags: imgs_src.append(img['data-src']) return imgs_srcdef download_imgs(imgs_src): ''' 下载壁纸 ''' if len(imgs_src): for index, src in enumerate(imgs_src): img = req_session.get(src, stream=True) img_name = src.split('/')[-1] store_path = '%s/%s' % (get_store_path(keyword), img_name) with open(store_path, 'wb') as f: for chunk in img.iter_content(chunk_size=128): f.write(chunk) print('下载进度:%d/%d' % (index + 1, len(imgs_src))) print('下载完成,图片已存放在:%s' % store_path) else: print('没有找到相关主题的壁纸')keyword = input('请输入你想要下载的壁纸主题:')page_size = int(input('请输入下载壁纸的页数,每页24张:'))print('开始查找壁纸....')html_list = get_img_html(page_size)img_src_list = []if len(html_list): print('查找完成') print('开始爬取壁纸地址...') for html in html_list: img_src_list.append(parse_html(html)) img_src_list = reduce(lambda x, y: x+y, img_src_list) print('爬取完成') print('开始下载壁纸...') download_imgs(img_src_list)else: print('没有找到相关主题的壁纸')复制代码
结果: