python爬虫日志(6)小小实践

通过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

相关文章
相关标签/搜索