前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python学习笔记(四) 爬取网站数据(静态,动态)

Python学习笔记(四) 爬取网站数据(静态,动态)

作者头像
java攻城狮
发布2020-10-10 16:33:58
6530
发布2020-10-10 16:33:58
举报
文章被收录于专栏:个人积累个人积累个人积累

Python学习笔记(四) 爬取网站数据(静态,动态)

1. 知识点

  • threading :python3版本之后的新线程函数
  • requests: 自带函数,用于请求网络地址
  • os: 自带函数,用于操作文件相关
  • openpyxl: 开源第三方的excel导出的库,需要手动下载pip install openpyxl
  • BeautifulSoup:html 代码美化工具

2. 基本函数的使用

2.1 网站静态数据爬取(需要熟悉h5标签元素选择器)
  1. 访问网站之后通过页面审查元素的方式,查看Element部分
  1. 找到你想爬取的内容部分,记录改内容的最外层标签元素或者类名
# -*- coding:UTF-8 -*-

import requests,sys
from bs4 import BeautifulSoup

class downloader(object):

    def __init__(self):
        self.server = 'http://bodboy.gitee.io/'
        self.target = 'http://bodboy.gitee.io/blog/'
        self.names = [] 
        self.urls =[] 
        self.nums = 0

    
    def getUrls(self):
        req = requests.get(url=self.target)
        req.encoding ='utf-8'
        html = req.text
        div = BeautifulSoup(html)
        div_list = div.find_all('header' ,class_ ='article-header')
        
       
        self.nums = len(div_list)
        for each in div_list:
       
            list_url = each.find_all('a' ,class_ ='article-title')
            print(list_url)
            url = list_url[0]
            self.urls.append(self.server + url.get('href'))
            self.names.append(url.string)
            

    def write(self ,name ,path ,text):
        write_flag = True
        with open(path,'a',encoding='utf-8') as f:
            f.writelines(text)
            f.write('\n\n')

if __name__ == "__main__":
    dl = downloader()
    dl.getUrls()
    print("开始下载文件....")
    for i in range(dl.nums):
        dl.write(dl.names[i], '博客文件.txt',dl.names[i] + '\r' + dl.urls[i])
        sys.stdout.write('已下载:%.3f%%' % float(i/dl.nums) + '\r') 
        sys.stdout.flush()

    print('文件下载完成')
  1. 运行文件
2.2 网站动态数据爬取(爬取接口数据)
  1. 实际上就是调用接口的形式,拿去接口中的数据,按照你想要的方式展示 例如,这个是拿网站某个接口数据,导出指定数据并下载图片
import threading
import requests
import os
from openpyxl import Workbook

class capturePc():

    def __init__(self):
        # 接口地址
        self.base_url = 'http://api.newibao.com/web/essay/publicEssayList'
        # 参数
        self.params ={
            'page':1,
            'size':64
        }

        # 模拟浏览器 如果需要登录 记上session 需要添加 token 
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
            'Accept-Encoding': 'gzip, deflate'
        }
    
    def get_list(self):
        req = requests.get(url=self.base_url,headers=self.headers,params=self.params)
        # 数据转换 
        data = req.json()
        print()
        try :
            if data['data']['list'] :
                data = data['data']['list']
                return data
        except :
            print("no data find")
            return None

    def get_img_list(self):
        res = self.get_list()
        imgUrls = []
        if res :
            for e in res :
                if e['picUrl']:
                    urls = e['picUrl']
                    imgUrls += urls
        
        print("图片列表为:",imgUrls)
        return imgUrls

    def get_excel_data(self):
        res = self.get_list()
        excel_list =[]
        if res :
            for e in res:
                cell = [e['addTime'],e['brief'],e['columnName'],e['details'],e['name'],e['updateTime']]
                excel_list.append(cell)

        print(excel_list)
        return excel_list

    def download_img(self,name):
         # 判断是否有文件夹 
        if not os.path.exists(name):
            os.mkdir(name)
            print("文件夹{}创建成功".format(name))
        imgList = self.get_img_list()
        names =0
        if imgList :
            for i in imgList:
                names += 1
                threading.Thread(target=self.download, args=(names, i,name)).start()

    def download(self,name,image_url,path):
        print('开始下载:', name)
        content = requests.get(image_url).content
        path = '%s/%s.jpg' % (path, name)
        with open(path, 'wb') as f:
            f.write(content)
        print('下载完成', name)

    def export_excel(self):
        # 创建 文件对象
        wb = Workbook()
        # 设置excel名称
        data_fileName = '蓝海图文数据.xlsx'
        # 新建一个表 
        ws = wb.active
        # 设置表头
        header =['创建时间','标题','分类','详情','名称','更新时间']

        for row in range(len(header)):
            c = row +1
            ws.cell(row=1, column = c,value =header[row])

        # 填写表中内容
        listIndex = self.get_excel_data()
        if listIndex :
            for imn in range(len(listIndex)):
                ws.append(listIndex[imn])

            wb.save(filename = data_fileName)
            print("写入成功")


if __name__ == "__main__":
    a = capturePc()
   # filename = str(input('请输入文件名,必须为英文名称'))
    
    a.export_excel()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python学习笔记(四) 爬取网站数据(静态,动态)
    • 1. 知识点
      • 2. 基本函数的使用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档