文章目录
- 1、爬取图片示例1:使用 .urlretrieve() 函数
- 2、爬取图片示例2 - 使用 open/write 函数
- 3、爬取图片示例3
- 3.1 使用 open/write 下载
- 3.2 使用 urlretrieve下载
爬虫的本质:模拟对应的App,浏览器访问对应的地址获取到数据
1、爬取图片示例1:使用 .urlretrieve() 函数
urlretrieve() 方法直接将远程数据下载到本地。下面我们再来看看 urllib 模块提供的 urlretrieve() 函数。
Help on function urlretrieve in module urllib:urlretrieve(url, filename=None, reporthook=None, data=None)
import requestsfrom lxml import etree
from urllib import requestmy_url_test = 'https://www.huya.com/g/4079'url_response_data = requests.get(my_url_test)response_status = url_response_data.status_code
print(f"url_response_data_text : [{response_status}]")
if response_status != 200: # 应答码为200,表示:查询成功print("download failed")
else:# 通过.text 可以获取到当前网页 返回的一手数据url_response_data_text = url_response_data.text# print(f"url_response_data_text : [{url_response_data_text}]")# 通过 .HTML 可以对原始数据进行清洗(解析)url_response_data_eTreeHtml = etree.HTML(url_response_data_text)print(f"url_response_data_eTreeHtml : [{url_response_data_eTreeHtml}]")# 通过 .xpath() 函数,可以从一手数据中筛选所有以 img class=‘pic‘开头的图片代码块url_response_data_pics = url_response_data_eTreeHtml.xpath('//img[@class="pic"]')print(f"url_response_data_pics : [{url_response_data_pics}]")for i in url_response_data_pics:print(f"url_response_data_pic_src1 : [{i.xpath('./@data-original')}]")print(f"url_response_data_pic_name1: [{i.xpath('./@alt')}]")pic_path = i.xpath('./@data-original')[0]pic_name = i.xpath('./@alt')[0]# 下载到本地request.urlretrieve(pic_path, r'./test001_down/'+pic_name+".jpg")
运行结果:
2、爬取图片示例2 - 使用 open/write 函数
from lxml import etree
import requests
import os
if __name__=="__main__":url='https://pic.netbian.com/4kyouxi/'headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'}response=requests.get(url=url,headers=headers)response.encoding='gbk'#图片名称乱码时的处理方式page_text=response.texttree=etree.HTML(page_text)li_list=tree.xpath('//div[@class="slist"]/ul/li')if not os.path.exists('./4K游戏'):os.mkdir('./4K游戏')for li in li_list:img_src='http://pic.netbian.com'+li.xpath('./a/img/@src')[0]img_name=li.xpath('./a/img/@alt')[0]+'.jpg'img_data=requests.get(url=img_src,headers=headers).contentimg_path='4K游戏/'+img_namewith open(img_path,'wb') as fp:fp.write(img_data)print(img_name,"下载成功")
在 Python 中使用文件的关键函数是 open() 函数。
open() 函数有两个参数:文件名和模式。
有四种打开文件的不同方法(模式):
- “r” - 读取 - 默认值。打开文件进行读取,如果文件不存在则报错。
- “a” - 追加 - 打开供追加的文件,如果不存在则创建该文件。
- “w” - 写入 - 打开文件进行写入,如果文件不存在则创建该文件。
- “x” - 创建 - 创建指定的文件,如果文件存在则返回错误。
此外,您可以指定文件是应该作为二进制还是文本模式进行处理。
- “t” - 文本 - 默认值。文本模式。
- “b” - 二进制 - 二进制模式(例如图像)。
虽然 open 函数也能实现文件的下载保存,但不建议使用IO操作,容易出现问题, for循环执行效率要快于with open的效率。
3、爬取图片示例3
3.1 使用 open/write 下载
from lxml import etree
import requests
from urllib import requesturl = 'http://www.haoduanzi.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
url_content = requests.get(url, headers=headers).texttree = etree.HTML(url_content)div_list = tree.xpath('//div[@id="main"]/div')[2:-1]i = 0
for div in div_list:img_url = div.xpath('./div/img/@src')[0]img_content = requests.get(url=img_url, headers=headers).contentrequest.urlretrieve(url=img_url, filename='img' + str(i) + '.jpg')i += 1
3.2 使用 urlretrieve下载
from lxml import etree
import requests
from uuid import uuid4
import time
from urllib import requesturl = 'http://www.haoduanzi.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
url_content = requests.get(url, headers=headers).texttree = etree.HTML(url_content)div_list = tree.xpath('//div[@id="main"]/div')[2:-1]
filename = uuid4()
# i = 0
for div in div_list:img_url = div.xpath('./div/img/@src')[0]img_content = requests.get(url=img_url, headers=headers).content# request.urlretrieve(url=img_url, filename='img' + str(i) + '.jpg')# i += 1time.sleep(2)with open(r'C:\jupyter\day02\%s.jpg' % filename, 'wb') as f:f.write(img_content)