案例:图片下载
爬虫步骤:
1.需求分析(本案例中爬去特定关键字的表情包,实现两个功能,搜索图片和自动下载)
2.分析网页源代码,配合F12
3.编写正则表达式或者其他解析器代码
4.正式编写python爬虫代码
代码实现:
"""
Created on Mon Aug 12 22:06:51 2019
@author: Omega_Sendoh
"""
"""
Date: 2019--07 10:29
User: yz
Email: 1147570523@qq.com
Desc:
"""
"""
图片批量下载器
"""
import os
import requests
import re
def downloadPic(html,keyword):
#每个图片对应一个url地址,用正则表达式获取所有(指定数目)图片地址
pic_url = re.findall('"objURL":"(.*?)",',html,re.s)[:20]
count=0
print("找到关键字:"+keyword+'的图片开始下载')
#用for循环取出pic_url中每个图片的url地址
for each in pic_url:
print("正在下载第"+str(count+1)+'张图片,图片地址:'+str(each))
try:
#更改代理
headers={
'User-Agent':"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
}
#从url地址中获取图片
pic = requests.get(each,timeout=10,headers=headers)
except requests.exceptions.ConnectionError:
print("【错误】当前图片无法下载")
count+=1
continue
except Exception as e:
print("当前图片无法下载")
print(e)
continue
else:
if pic.status_code!=200:
print("请求失败!")
continue
#生成文件夹储存图片
if not os.path.exists(imgDir):
print("正在创建目录",imgDir)
os.makedirs(imgDir)
#查看图片后缀
posix = each.split(".")[-1]
print("正在创建目录",imgDir)
#图片名称
name = keyword + '_' + str(count)+ '.' + posix
filename = os.path.join(imgDir,name)
count +=1
with open (filename,'wb') as f:
f.write(pic.content)
if __name__ == '__main__':
imgDir = 'pictures'
word = input('输入关键字信息:')
url="http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word="+word
#从网页url中获取信息
try:
result = requests.get(url)
except Exception as e:
print(e)
content=''
else:
content = result.text
downloadPic(content,word)
urlib模块和requests模块
urllib的第一种方式:
浏览器的模拟
应用场景:有些网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置,而我们又想进行爬取。
解决方法:设置一些Headers信息(User-Agent),模拟成浏览器去访问这些网站。
第二种方式requests模块
代理服务器的设置
应用场景:使用同一个IP去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。
解决方法:使用代理服务器。(使用代理服务器去爬取某个网站的内容的时候,在对方的网站上,显示的不是我们真实的IP地址,而是代理服务器的IP地址)