爬虫学习 Fay·D·Flourite

爬虫学习


这几天想加深一下python的学习,就想着写个简单的爬虫来学习学习。爬的是p站的图片(指pixiv…好8其实也差不多),绝对不是为了ghs!

写下思路,我引用了requests和beautifulsoup4 requests是为了请求网站而beautifulsoup4是为了提取网站内容,requests也可以用urllib库来代替,不过我没用过urllib库,而且好像requests比urllib来的更简单,之后有时间会去了解urllib库。其实本来也想用正则表达式去过滤内容的,不过学着学着了解到了bs4这个东西,突然感觉这玩意儿比正则简单多了,不过写完这个还会继续学正则表达式(毕竟正则无论是在题还是在实践还是用途挺广的)。

我的目标是爬p站的日榜图片,先是收集相关的信息,比如p站日榜的url是
https://www.pixiv.net/ranking.php?mode=daily
然后发现p站日榜中的图片的地址,比如这个
https://i.pximg.net/c/240x480/img-master/img/2019/12/18/20/58/20/78357442_p0_master1200.jpg
不过这个图片是缩略图,很模糊,也很小,我们就要去找原图地址。点开日榜的图片,再找图片的来源,这时就得到了图片的原图地址
https://i.pximg.net/img-master/img/2019/12/18/20/58/20/78357442_p0_master1200.jpg
可以很明确的看出他和上面那个链接的差别仅是url中少了一个
/c/240x480
我们就不用每个都去单独读取了,直接获取日榜所有缩略图的地址再把地址改成原图地址就行了。还有什么值得注意的地方的话,就是在请求图片地址的时候,需要添加referer头和user-agent头,p站会验证请求头以防止盗链,否则会403forbidden(这个地方还卡了我好一会儿…)把源码贴出来

import requests
from bs4 import BeautifulSoup
import time
import os
#目前想要实现内容包括
#下载指定天日的日榜图片(暂时没找到之前的日榜,不知道是不是每日更新还是保存到了一个地方)
#选择日榜月榜

Referer='http://www.pixiv.net/member_illust.php?mode=medium&illust_id=here'
url='https://www.pixiv.net/ranking.php?mode=daily'#日榜

print("=====================================================================================================")
print("|           _________          ______    ____       _____         ______      _______     ______    |")
print("|          |---------\        |------|   \---\     /----/        |------|     |-----/    /-----/    |")
print("|           |--|   \---\       |---|       \--\   /---/           |---|       |---/     /---/       |")
print("|           |-|     |---|      |--|         \--\/---/             |--|        /--/    /---/         |")
print("|          |--|    /---/      |--|           |-- -/              |--|        /--/   /---/           |")
print("|         |----------/       |--|           /----\              |--|        /--/  /---/             |")
print("|        |---|              |--|           /--/ \--\           |--|        /--/ /---/               |")
print("|       |---|              |--|          /---/   \--\         |--|        /-------/                 |")
print("|      |---|             |-----|        /---/    |---\      |----|       /------/                   |")
print("|     |-----|           |-------|      /----\    /----\    |------|     /-----/                     |")
print("|                                                                                                   |")
print("=====================================================================================================")



r=requests.get(url)
soup=BeautifulSoup(r.text,'html.parser')


def getReferer(url):#构造要访问图片的 reference 头
    idname=url[55:63]#得到图片id
    url=Referer.replace('here',idname)#替换为图片地址
    
def mkdir(path):#创建文件夹
    path=path.strip()
    path=path.rstrip("\\")
    isExists=os.path.exists(path)
    if not isExists:
        os.makedirs(path)
        return True
    else:
        return False


def download(url):#下载图片到指定文件夹并用时间和id命名
    ttt=getReferer(url)
    img_headers = {#构造请求头
                'Referer': 'http://www.pixiv.net/member_illust.php?mode=medium&illust_id='
                ,
                'User-Agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/" +
                              "537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36"
                              }
    website=requests.get(url,headers=img_headers)
    date=time.strftime("%Y-%m-%d", time.localtime())
    name=url[35:39]+url[40:42]+url[43:45]+url[46:48]+url[49:51]+url[52:54]+'_'+url[55:63]
    path='F:/P站图片/'+date
    mkdir(path)
    with open('F:/P站图片/'+date+'/'+name+'.jpg', 'wb') as f:#下载图片
        f.write(website.content)
        print('下载完成')

    
def correct_url(url):#改为原图路径
    url=url.replace('c/240x480/','')
    print(url)

for link in soup.find_all('img'):#获取日榜的图片url
    l=link.get('data-src')
    l=l.replace('c/240x480/','')#这里将缩略图的地址换为原图的地址
    print(l)
    download(l)

print('今日日榜下载完成,明天再来哦~')


目前还有点想实现的功能还没实现,改完会进行修改,还有就是…这个脚本实在不怎么美观…如果有什么修改意见可以留言嗷~(这是我写的第一个爬虫,敬请指教!)

PS:修改了一下,加了os库和time库,方便归类每一天的日榜图片