经过3天的学习,现在对简单的网页基本可以爬取想爬取的信息了,但还无法应对网站一些复杂的反爬虫措施。
今天利用目前为止所学的知识,试着爬取了煎蛋网几页图片并下载到本地。
#首先还是先导入所需的库
import requests
import base64 #这个库我也是第一用,它的功能貌似是用于加密解密的,具体怎么用,后面再研究
import urllib.request
import time
from bs4 import BeautifulSoup
urls=['http://jandan.net/pic/page-{}'.format(i) for i in range(226,228)]#一个列表储存所有的网页地址
headers={'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
cnt=0 #用于记录下载的图片数目,也方便命名
folder_path='D://pictures/' #我的路径
def get_images(url): #自定义的函数,参数是要爬取的网页的地址
data=requests.get(url,headers=headers) #请求
soup=BeautifulSoup(data.text,'lxml') #解析,这两步不用多讲了
imgurl=soup.find_all(class_='img-hash') #find_all函数在之前也讲过了,功能就是字面意思,找到所有的符合条件的元素
time.sleep(2) #延迟2秒,一些网站如果过于频繁的访问,可能会触发反爬虫机制,这里延迟2秒,确保爬取过程顺利进行
real_urls=[] #因为网站的反爬取措施,所有的图片的真实地址都被加了密,所以不能用普通方法爬取,要先解密
for j in imgurl:
real_urls.append(base64.b64decode(j.text).decode('utf-8'))
#base64.b64decode(j.text).decode('utf-8')这个函数的返回值就是真实网页的地址,不过这个方法不确保适用其他加密方法
for i in real_urls:
_url='http:'+i #构造地址
global cnt
cnt=cnt+1 #每个图片的序号作为文件名
if 'jpg' in i: #有的文件的图片,有的是动态图
address=folder_path+str(cnt)+'.jpg'
elif 'gif' in i:
address = folder_path + str(cnt) + '.gif'
urllib.request.urlretrieve(_url,address)
print("done")
#最后调用函数
for url in urls:
get_images(url)
最后成果。因为是只是练习,所以并没有爬取很多图片,只爬了两页。学习爬虫的朋友在练习时也适当爬取就好,不然频繁访问,会给服务器造成很大压力。自己学习的同时也不要对他人造成困扰。