python中使用requests库获取图片,且正则表达式中re.S的用法以及r.text和r.content的区别和搜索关键词
这里我获取的是昵图网的图片
代码附上
这里我获取的是2020的图片
import re
import requests
url="http://soso.nipic.com/?q=2020"
r=requests.get(url)
html=r.text
#listm=re.findall(r'<img src="(.*?)"',html,re.S) #这是第一次获取的src的属性
listm=re.findall(r'data-original="(.*?.jpg)"',html,re.S) #第二次获取的是data-original的属性
i=1
for key in listm:
print(key)
pic=requests.get(key)
path="dogPic\\"+str(i)+".jpg" #前面冒号里是你要保存的路径 ,后面是改了个名字并以jpg为后缀保存,我第一次用的gif
fp=open(path,"wb")
fp.write(pic.content) #这个、content可以看我的另一篇文章
fp.close()
i+=1
附上结果
这是我第一次获取src里的地址的得到的结果
这是第二次获取data-original里的地址得到的的结果
第二次用data-original的属性才获取到图片的原因是:本来src储存的是图片的真正地址,但是用了dtata-original属性给图片做了延迟加载处理,所以图片的真正的地址存储在data-original里里面,所以获取的时候要擦亮眼睛哦
1.关键词
这里的url是"http://soso.nipic.com/?q=2020"
这里的q=关键词,这个关键词是你搜索的关键词,我这里搜索的是2020,如果你想要获取的是上海的图片,把2020改成上海即可,即
url=”http://soso.nipic.com/?q=上海"
当然要注意有的网站的关键词是keyword=关键词
2.正则中re.S的用法
它表示“.”(不包含外侧双引号,下同)的作用扩展到整个字符串,包括“\n”
举个例子
import re
a = '''asdfsafhellopass:
158899
worldcfghjm
'''
b = re.findall('hello(.*?)world',a)
c = re.findall('hello(.*?)world',a,re.S)
print 'b is ' , b
print 'c is ' , c
结果为:
b is [] #这里的空是因为找不到第三行的world,即没有找到匹配的内容
c is ['pass:\n\t158899\n\t'] #这里由于使用了 re.S
不知道大家注意到没有c的结果获取出来没有hello和word,这是另一个知识点,点击看另一篇(.*?用法与r.text和r.content的用法)
总结
“.”的作用是匹配除“\n”以外的任何字符,
不加re.S,“.”不匹配换行符,所以只在一行中匹配,不会换行,一次匹配一行
而加了re.S,可以识别换行符"\n"可以在整个字符串匹配