通过3天的学习,如今对简单的网页基本能够爬取想爬取的信息了,但还没法应对网站一些复杂的反爬虫措施。python
今天利用目前为止所学的知识,试着爬取了煎蛋网几页图片并下载到本地。服务器
#首先仍是先导入所需的库 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)
最后成果。由于是只是练习,因此并无爬取不少图片,只爬了两页。学习爬虫的朋友在练习时也适当爬取就好,否则频繁访问,会给服务器形成很大压力。本身学习的同时也不要对他人形成困扰。app