爬虫从入门到入预(8)

今天的强度不算很大,其实都是之前做过的事情,主要是还是用BS4里面的Beautifulsoup来爬取网页图片。因为老师用的是优美图库,但是我们现在已经使用不了了,所以在百度上随便找了一个桌面壁纸的网站,嘻嘻嘻下一点我喜欢的DOTA2壁纸。

#1.拿到主页面的源代码,然后提取到子页面的链接href
#2.通过href拿到子页面的内容,然后找到下载链接,进行下载 “img里面src的值就是下载地址”
#3.下载图片

这里的url1是因为子页面的url需要拼接主页url。但是我们使用的搜索出来的url和主页url不一致,所以这里把主页url携程url1.

import requests
from bs4 import BeautifulSoup
headers={
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
url1="https://pic.netbian.com"

还是老套路,用for循环获取搜索dota的子页面的每一页的信息。总共有3页,0,1,2

for c in range(0,2):
    url="https://pic.netbian.com/e/search/result/index.php?page="+"c"+"&searchid=2700"
    resp=requests.get(url,headers=headers)
    resp.close()
    #print(resp.text)

日常代码解析,变成bs4类型

#把源代码交给beautifulsoup
    main_page=BeautifulSoup(resp.text,"html.parser")
    a_list=main_page.find("ul",class_="clearfix").find_all("a")
    #print(a_list)

其实这里我多写了一步,在搜索结果的子页面里面就已经包含了下载地址的url,但是为了多训练一下自己对bs4的理解,我还是进入了单一图片后再获取次级子页面的下载url 。

    for a in a_list:
        #print(url1+a.get("href"))#直接通过get可以获得属性的值
        #拿到子页面的源代码
        child_page_resp=requests.get(url1+a.get("href"),headers=headers)
        child_page_resp.close()
        #丛子页面中拿到图片的下载地址
        child_page=BeautifulSoup(child_page_resp.text,"html.parser")
        child_page_img_label=child_page.find("div",class_="photo-pic").find("img")
        downloadurl=child_page_img_label.get("src")
        #print(url1+downloadurl)

最后是下载图片,因为获取的图片内容是字节,所以我们写入文件的时候mode选择wb。然后用url最后一个“/”后面的内容作为图片的名字。 

 #下载图片
        img_resp=requests.get(url1+downloadurl)
        img_resp.content#这里拿到的是字节
        img_name=downloadurl.split("/")[-1]#拿到url中最后一个/后面的内容作为图片名称
        with open(img_name,mode="wb") as f:
            f.write(img_resp.content)  #图片内容写入文件
        print("over!",img_name)

最后我们所有的代码如下图所示:

#1.拿到主页面的源代码,然后提取到子页面的链接href
#2.通过href拿到子页面的内容,然后找到下载链接,进行下载 “img里面src的值就是下载地址”
#3.下载图片
import requests
from bs4 import BeautifulSoup
headers={
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
url1="https://pic.netbian.com"
for c in range(0,2):
    url="https://pic.netbian.com/e/search/result/index.php?page="+"c"+"&searchid=2700"
    resp=requests.get(url,headers=headers)
    resp.close()
    #print(resp.text)

    #把源代码交给beautifulsoup
    main_page=BeautifulSoup(resp.text,"html.parser")
    a_list=main_page.find("ul",class_="clearfix").find_all("a")
    #print(a_list)

    for a in a_list:
        #print(url1+a.get("href"))#直接通过get可以获得属性的值
        #拿到子页面的源代码
        child_page_resp=requests.get(url1+a.get("href"),headers=headers)
        child_page_resp.close()
        #丛子页面中拿到图片的下载地址
        child_page=BeautifulSoup(child_page_resp.text,"html.parser")
        child_page_img_label=child_page.find("div",class_="photo-pic").find("img")
        downloadurl=child_page_img_label.get("src")
        #print(url1+downloadurl)

        #下载图片
        img_resp=requests.get(url1+downloadurl)
        img_resp.content#这里拿到的是字节
        img_name=downloadurl.split("/")[-1]#拿到url中最后一个/后面的内容作为图片名称
        with open(img_name,mode="wb") as f:
            f.write(img_resp.content)  #图片内容写入文件
        print("over!",img_name)

print("all over!")



这里面存在一些问题,因为我使用的是for循环去获取搜索结果页面0,1,2的图片,但是for循环好像不起作用了,整个程序跑完得到的只有第一页的图片,后面两页的都没有。我以为是我的程序写错了,然后我取消了for循环,手动分别下载了0,1,2页面的图片,在仅注释 (for c in range(0,2):)这句话的基础上下载,结果完全正确,这就让我非常不解,因为有点累了,所以不想动脑经了,反正也没有人看这篇帖子,等未来有个有缘人帮我解答吧!

题外话,哈哈哈博主本人可以说是一个刀斯林了,完了好多年,可惜还是很菜。这里夹带点私活,放几张今天爬出来的我觉得很好的dota2的壁纸,希望这游戏不要死了吧。

---------------------------------------------分割线--------------------------------------------------------------------------

老师说最好还是加一个时间控制,避免访问过快

import time

******

time.sleep(1)#暂停一秒继续运行程序

还有另外一个坑就是,我是用的是pycharm,每次写入图片的时候,pycharm都会对所有文件创建一个索引,为了快速找到需求文件。但是我们下载图片是没必要索引的,另外如果我们下载图片很多的时候,ide就会变得很卡,所以我们可以对存放图片的文件夹右键,找到mark directory as ——>excluted,这样pycharm就不会对这个文件夹内的文件创建索引。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值