第二十八篇 网页实战之静态网页爬取,四大案例,小说,书,图片等抓取操作

心得:不知道从什么时候开始,喜欢上了思考,完全可以把自己沉浸在自己的程序中,看着自己一点点的累积,慢慢的成长,证明这一天没有白白浪费掉,感谢还在认真的你。

自己在学习过程中总结出来的爬虫的过程:
1.导入库,确定要用到的库
2.确定要爬取的url:
静态网页需要爬取的数据就是我们地址栏里的url,当我们需要抓取的数据不存在时,极有可能是动态网页。
动态网页往往隐藏了在XHR页面内,需要发掘和寻找,找出的数据往往是json格式的数据,需要进一步去提取。(ajax加载)
3.数据解析:
三种解析方式,正则表达式,BeautifulSoup,xpath 提取需要的数据
4.持久化存储:
往往存储的格式为数据本身的格式:
文本格式 with open(“log.txt”,“w”,encoding=“utf-8”) as f:
文件格式 with open(“music.mp3”,“wb”) as f:

今天主要写关于静态网页爬取的细节:

案例一:爬取空气质量全部城市的名称

先看看网页:https://www.aqistudy.cn/historydata/
在这里插入图片描述
看看网页城市名称对应的代码:
在这里插入图片描述
直接写xpath进行定位爬取:

#cording=utf-8

import requests
from lxml import etree

headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }
    
url="https://www.aqistudy.cn/historydata/"

r_text=requests.get(url=url,headers=headers).text
etree=etree.HTML(r_text)  #实例化xpath
hot_city=etree.xpath('//div[@class="hot"]/div[@class="bottom"]/ul/li/a/text()')   #逐一取抓取
normal_city=etree.xpath('//div[@class="all"]/div[@class="bottom"]/ul/div[2]/li/a/text()')  #逐一抓取
lis=[]
lis=hot_city+normal_city #合并

print(lis,len(lis))

#也可以使用bool进行连接
all_city=etree.xpath('//div[@class="hot"]/div[@class="bottom"]/ul/li/a/text() | //div[@class="all"]/div[@class="bottom"]/ul/div[2]/li/a/text()') 
print(all_city,len(all_city))

结果:

PS C:\Users\TianJian\Desktop\python> & C:/Users/TianJian/AppData/Local/Microsoft/WindowsApps/python.exe c:/Users/TianJian/Desktop/python/数据解析1107/全国城市.py
['北京', '上海', '广州', '深圳', '杭州', '天津', '成都', '南京', '西安', '武汉', '阿坝州', '安康', '阿克苏地区', '阿里地区', '阿拉善盟', '阿勒泰地区', '安庆', '安顺', '鞍山', '克孜勒苏
州', '安阳', '蚌埠', '白城', '保定', '北海', '宝鸡', '北京', '毕节', '博州', '白山', '百色', '保山', '白沙', '包头', '保亭', '本溪', '巴彦淖尔', '白银', '巴中', '滨州', '亳州', '长春', '昌都', '常德', '成都', '承德', '赤峰', '昌吉州', '五家渠', '昌江', '澄迈', '重庆', '长沙', '常熟', '楚雄州', '朝阳', '沧州', '长治', '常州', '潮州', '郴州', '池州', '崇左', '滁州', '定安', '丹东', '东方', '东莞', '德宏州', '大理州', '大连', '大庆', '大同', '定西', '大兴安岭地区', '德阳', '东营', '黔南州', '达州', '德州', '儋州', '鄂尔多斯', '恩施州', '鄂州', '防城
港', '佛山', '抚顺', '阜新', '阜阳', '富阳', '抚州', '福州', '广安', '贵港', '桂林', '果洛州', '甘南州', '固原', '广元', '贵阳', '甘孜州', '赣州', '广州', '淮安', '海北州', '鹤壁', '淮
北', '河池', '海东地区', '邯郸', '哈尔滨', '合肥', '鹤岗', '黄冈', '黑河', '红河州', '怀化', '呼和浩特', '海口', '呼伦贝尔', '葫芦岛', '哈密地区', '海门', '海南州', '淮南', '黄南州', '衡水', '黄山', '黄石', '和田地区', '海西州', '河源', '衡阳', '汉中', '杭州', '菏泽', '贺州', '湖州', '惠州', '吉安', '金昌', '晋城', '景德镇', '金华', '西双版纳州', '九江', '吉林', '即
墨', '江门', '荆门', '佳木斯', '济南', '济宁', '胶南', '酒泉', '句容', '湘西州', '金坛', '鸡西', '嘉兴', '江阴', '揭阳', '济源', '嘉峪关', '胶州', '焦作', '锦州', '晋中', '荆州', '库尔
勒', '开封', '黔东南州', '克拉玛依', '昆明', '喀什地区', '昆山', '临安', '六安', '来宾', '聊城', '临沧', '娄底', '乐东', '廊坊', '临汾', '临高', '漯河', '丽江', '吕梁', '陇南', '六盘水
', '拉萨', '乐山', '丽水', '凉山州', '陵水', '莱芜', '莱西', '临夏州', '溧阳', '辽阳', '辽源', '临沂', '龙岩', '洛阳', '连云港', '莱州', '兰州', '林芝', '柳州', '泸州', '马鞍山', '牡丹
江', '茂名', '眉山', '绵阳', '梅州', '宁波', '南昌', '南充', '宁德', '内江', '南京', '怒江州', '南宁', '南平', '那曲地区', '南通', '南阳', '平度', '平顶山', '普洱', '盘锦', '蓬莱', '平
凉', '莆田', '萍乡', '濮阳', '攀枝花', '青岛', '琼海', '秦皇岛', '曲靖', '齐齐哈尔', '七台河', '黔西南州', '清远', '庆阳', '钦州', '衢州', '泉州', '琼中', '荣成', '日喀则', '乳山', '日
照', '韶关', '寿光', '上海', '绥化', '石河子', '石家庄', '商洛', '三明', '三门峡', '山南', '遂宁', '四平', '商丘', '宿迁', '上饶', '汕头', '汕尾', '绍兴', '三亚', '邵阳', '沈阳', '十堰
', '松原', '双鸭山', '深圳', '朔州', '宿州', '随州', '苏州', '石嘴山', '泰安', '塔城地区', '太仓', '铜川', '屯昌', '通化', '天津', '铁岭', '通辽', '铜陵', '吐鲁番地区', '铜仁地区', '唐
山', '天水', '太原', '台州', '泰州', '文昌', '文登', '潍坊', '瓦房店', '威海', '乌海', '芜湖', '武汉', '吴江', '乌兰察布', '乌鲁木齐', '渭南', '万宁', '文山州', '武威', '无锡', '温州', '吴忠', '梧州', '五指山', '西安', '兴安盟', '许昌', '宣城', '襄阳', '孝感', '迪庆州', '锡林郭勒盟', '厦门', '西宁', '咸宁', '湘潭', '邢台', '新乡', '咸阳', '新余', '信阳', '忻州', '徐
州', '雅安', '延安', '延边州', '宜宾', '盐城', '宜昌', '宜春', '银川', '运城', '伊春', '云浮', '阳江', '营口', '榆林', '玉林', '伊犁哈萨克州', '阳泉', '玉树州', '烟台', '鹰潭', '义乌', '宜兴', '玉溪', '益阳', '岳阳', '扬州', '永州', '淄博', '自贡', '珠海', '湛江', '镇江', '诸暨', '张家港', '张家界', '张家口', '周口', '驻马店', '章丘', '肇庆', '中山', '舟山', '昭通', '中卫', '张掖', '招远', '资阳', '遵义', '枣庄', '漳州', '郑州', '株洲'] 394

案例二:爬取四大名著

看看要爬取的网页:
第一层:书名
在这里插入图片描述
第二层:目录名
在这里插入图片描述
第三层:内容
在这里插入图片描述
由于这是一个静态的网址,我们可以直接一层一层的去定位抓取,然后存储为我们需要的文本。

#coding=utf-8
import requests
from bs4 import BeautifulSoup
import os
headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }

def book_get(url,book_path,chapter_url_head): #章节url和内容爬取函数
    if os.path.exists(book_path):
        os.remove(book_path)

    r_text=requests.get(url=url,headers=headers).text.encode("utf-8").decode("utf-8")

    soup = BeautifulSoup(r_text,"html.parser")

    text=soup.select("div.book-mulu>ul>li>a")
    for a in text:
        chapter_url=a.attrs['href']
        chapter_title=a.string
        chapter_url=chapter_url_head+chapter_url
        chapter_content=requests.get(url=chapter_url,headers=headers).text.encode('utf-8').decode('utf-8')
        soup_content=BeautifulSoup(chapter_content,"html.parser")
        chapter_text=soup_content.find("div",class_="chapter_content") #节点对象
        chapter_text=chapter_text.text    #节点对象
        with open(book_path,"a",encoding="utf-8") as f:
            f.write(chapter_title+":\n"+chapter_text+"\n")
            print(chapter_title+" 下载完成")

chapter_url_head="http://www.shicimingju.com"
sishu_url="http://www.shicimingju.com/bookmark/sidamingzhu.html"         
r_sishu=requests.get(url=sishu_url,headers=headers).text.encode("utf-8").decode("utf-8")
sishu_soup=BeautifulSoup(r_sishu,"html.parser")
sishu_list=sishu_soup.select("div.bookmark-list>ul>li>h3>a")   #抓到了a标签的内容列表

for a in sishu_list:
    sishu_name=a.string    #取出名字
    sishu_name=sishu_name.replace("《","").replace("》","")  #取出特殊符号
    sishu_url=a.attrs['href']  #从a标签中取出url
    sishu_url=chapter_url_head+sishu_url  #完整url
    sishu_path="./数据解析1107/"+sishu_name+".txt"  #完整存储路径
    book_get(sishu_url,sishu_path,chapter_url_head)  
    print(sishu_name+" 下载完成")

案例三:爬取小说网站小说

看看网页内容:

第一层书名:
在这里插入图片描述
第二层:章节目录名
在这里插入图片描述
第三层:小说内容
在这里插入图片描述
代码:

#coding=utf-8
import requests
from bs4 import BeautifulSoup
from lxml import etree
import os
from time import time

t0=time()

headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }

if not os.path.exists("./数据解析1107/book/"):
    os.mkdir("./数据解析1107/book/")


def grap_book(url,book_path):
  if os.path.exists(book_path):
          os.remove(book_path)

  r_text=requests.get(url=url,headers=headers).text.encode("utf-8").decode("utf-8")
  soup=BeautifulSoup(r_text,"html.parser")
  chapter=soup.select("ul.chapter-list>li>a")
  for a in chapter:
      chapter_name=a.string
      chapter_url=a.attrs['href']
      chapter_text=requests.get(url=chapter_url,headers=headers).text.encode("utf-8").decode("utf-8") #爬取对应url的小说内容
      chapter_soup=BeautifulSoup(chapter_text,"html.parser")
      with open(book_path,"a",encoding="utf-8") as f: #章节title
              f.write("\n"+chapter_name+" :\n\n")
      chapter_content=chapter_soup.select("div.content>p")  #小说内容
      for p in chapter_content:
          chapters_content=p.string
          with open(book_path,"a",encoding="utf-8") as f:
              f.write(chapters_content+"\n")
      print(chapter_name+" 下载完成")

def novel(first_url):  #抓取排行榜的全部小说
    first_r=requests.get(url=first_url,headers=headers).text.encode("utf-8").decode("utf-8")
    first_etree=etree.HTML(first_r)
    second_url_list=first_etree.xpath('//div[@class="bookinfo"]/div[@class="bookname"]/a/@href') #每本小说的url
    second_name_list=first_etree.xpath('//div[@class="bookinfo"]/div[@class="bookname"]/a/text()')#每本小说的名字
    for second_name,second_url in zip(second_name_list,second_url_list): #同时遍历url和书名
        print(second_name+" "+second_url)
        second_r=requests.get(url=second_url,headers=headers).text.encode("utf-8").decode("utf-8") #抓取小说章节
        second_etree=etree.HTML(second_r)
        three_url=second_etree.xpath('//a[@class="all-catalog"]/@href')[0] #抓取章节的url
        book_path="./数据解析1107/book/%s.txt"%second_name
        t1=time()
        grap_book(three_url,book_path)
        t2=time()
        print("\n\n\n"+second_name+"--------下载完成--------用时:%.2f秒\n\n\n"%(t2-t1)) #下载每本小说的时间

#first_url="http://book.zongheng.com/store/c0/c0/b0/u1/p1/v0/s9/t1/u0/i1/ALL.html"  #男频
#first_url="http://book.zongheng.com/store/c0/c0/b1/u1/p1/v0/s9/t1/u0/i1/ALL.html"  #女频
first_url="http://book.zongheng.com/store/c1/c0/b0/u1/p1/v0/s9/t1/u0/i1/ALL.html"  #男奇幻玄幻
novel(first_url)
t3=time()
print("\n\n\n总共用时 :%.2f秒"%(t3-t0)) #总用时

结果:
在这里插入图片描述

案例四:爬取高清大图
看看网页:可以抓到对应图片的url,但注意的是url并不完整,所以需要寻找完整的url.
在这里插入图片描述
寻找完整的url:找到对应的图片资源,然后可以在代码里进行拼接操作
在这里插入图片描述

看看代码:

#coding=utf-8
import requests
from lxml import etree
from bs4 import BeautifulSoup
import sys
import os

filepath="C:\\Users\\TianJian\\Desktop\\python\\数据解析1107\\4k动物图片\\"
# for tu_file in os.listdir(filepath):    #删除文件夹内的文件
#     os.remove(filepath+str(tu_file))
if not os.path.exists(filepath):
    os.mkdir(filepath)


headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }
    
for i in range(2,10): #抓取前10页的图片
    #url="http://pic.netbian.com/4kmeinv/index_%d.html"%i #美女
    #url="http://pic.netbian.com/4kfengjing/index_%d.html"%i #风景
    url="http://pic.netbian.com/4kdongwu/index_%d.html"%i #动物
    print(url)
#url="http://pic.netbian.com/4kmeinv/"  #http://pic.netbian.com/4kmeinv/index_3.html
    r_text=requests.get(url=url,headers=headers).text.encode("utf-8").decode("utf-8")
    #实例化xpth
    r_xpath=etree.HTML(r_text)
    r_url=r_xpath.xpath('//ul[@class="clearfix"]/li/a/img/@src')
    for tu_url in r_url:  
        tu_name=tu_url.split('/')[-1]  #取出图片名称
        downloadpath=filepath+tu_name  #拼接下载地址
        tu_path="http://pic.netbian.com"+tu_url #拼接网址
        #print(tu_name,downloadpath)
        tu_r=requests.get(url=tu_path,headers=headers).content  #爬取图片原地址
        with open(downloadpath,"wb") as f: #持久化存储
            f.write(tu_r)
            print(tu_name+"finish")

结果:
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值