简单说说Python爬取图片数据的一个流程:
1、发送请求:调用requests模块里的get请求方法对于url地址发送请求,并且携带上headers请求头伪装,最后用自定义变量名接收返回数据;
2、获取数据:调用re模块里的findall方法,找到所有我们想要的数据;
3、发送请求:此次请求是发送给目标图片所在的网页地址;
4、获取数据;
5、解析图片:因为我们爬取图片肯定不是只想要一张,那爬取大量图片呢,就需要找到这些图片的共同规律,从规律入手。
6、保存数据;
为什么会发送两次请求呢?答:第一是向主页面地址发送请求,第二是向目标图片的详细地址发送请求;
示例:爬取彼岸壁纸网站的图片
#导入数据请求模块
import requests
import re #正则表达式模块
url='http://www.netbian.com/dongman/index_2.htm' #请求链接
#模拟浏览器 开发者工具:headers->request headers->UA(User Agent)
#把爬虫程序伪装成浏览器去访问,防止被反爬
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/96.0.4664.45 Safari/537.36'
} #User-Agent用户代理(浏览器基本的身份信息)
'''
1、发送请求
调用requests模块里的get请求方法对于url地址发送请求,并且携带上headers请求头伪装,最后用自定义变量名接收返回数据
<response [200]:响应对象>
response:回复
<>:表示对象
200:状态码表示请求成功
'''
response=requests.get(url=url,headers=headers)
response.encoding = 'GBK' #不加这一行的话获取网页代码若是有中文会出现乱码情况 因为目的网页代码的编码格式是gbk
''''
2.获取数据
findall('什么数据','什么地方') 调用re模块里的findall方法,找到所有我们想要的数据
从response.text<网页源代码>里面。去找<a href='/desk/(\d+).htm'>这段数据,其中(\d+)这段数据就是我们要的内容
\d+:表示匹配多个数字
'''
#print(response.text) #获取响应文本数据<网页源代码>
#寻找图片信息规律;彼岸壁纸网站的提取图片id
img_id_list = re.findall('<a href="/desk/(\d+).htm"',response.text)#找到所有我们想要的数据
#for循环遍历,把列表里面元素一个一个提取出来
for img_id in img_id_list:
#构建图片详情页链接; f'{}'字符串格式化方法
link = f'http://www.netbian.com/desk/{img_id}.htm' #某一张图片的详细链接地址
#print(link)
'''
3、发送请求
4、获取数据
5、解析图片
'''
response_1=requests.get(url=link, headers=headers)
response_1.encoding='gbk'
img_url,img_title=re.findall('<img src="(.*?)" alt="(.*?)"',response_1.text)[0]
'''
6、保存数据
获取图片数据->发送请求,然后获取数据
response.content-->获取图片/音频/视频/特定格式文件二进制数据
'''
img_content = requests.get(url=img_url, headers=headers).content
with open('img1/'+ img_title + '.jpg', 'wb') as f:
f.write(img_content) #此处的img1是新建的空的文件夹,此文件跟代码文件放在同一目录下;
print(img_url, img_title)
运行结果如下图:
此示例中的一些方法介绍:
(1)response=requests.get(url=url,headers=headers):构造一个向服务器请求资源的url对象,这个对象是request库内部生成的。
response=requests.get(url,params,**kwargs)
- url:需要爬取的网站地址;
- params:url中的额外参数,字典或者字节流格式,是可选参数;
- **kwargs:12个控制访问的参数。
(2)findall():此方法是re正则库中的方法,它将所有匹配到的字符,以列表的形式返回。
findall(pattern, string, flags=0)
作用:获取字符串中所有能匹配的字符串,并以列表的形式返回。
pattern: 匹配的正则表达式
string:被匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写,是否匹配多行等