python爬取数据并将数据写入execl表中

文章目录

概要

提示:python爬取数据并将数据写入execl表中,仅供学习使用,代码是很久前的,可能执行不通,自行参考学习。

# -*- coding: utf-8 -*-
import datetime  # 日期库
import requests  # 进行网络请求
import xlwt  # 与excel相关的操作
from lxml import etree  # 引入xpath库,方便定位元素
import time  # 进行访问频率控制
import random  # 随机数生成
import math  # 数学库

# main
def main(word, filename):
    word = word
    filename = filename
    Savepath = "./test/" + filename + ".xls"  # 存储路径
    datalist = getdata(word)      # 获取爬取的关键词数据
    savedata(datalist, Savepath)  # 保存的数据和路径参数


# 获取html源码
def ask_url(url):
    html = ""
    # 进行伪装头信息,防止416错误,模拟浏览器头部信息,向豆瓣服务器发送消息(最好加上cookie)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/83.0.4103.116 Safari/537.36 "
    }
    try:
        response = requests.get(url, headers=headers,timeout=10)  # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
        time.sleep(random.randint(1, 3))  # 每隔1-3s执行一次请求
        html = response.content  # 获取网页的html源代码
        print("请求访问成功")
    except requests.exceptions.RequestException as e:
        print("超时")  # 10秒请求无响应则显示超时
        print(e)
    return html

# 获取站长工具网站关键词总数
def num(word):
    word = word  # 关键词
    url = 'http://rank.chinaz.com/' + word     # 站长工具查询关键词URL
    num = ask_url(url)                         # 获取网页源码
    num1 = etree.HTML(num)                     # 解析网页
    try:
        global num2   # 全局变量 num2
        num2 = num1.xpath('/html/body/div[3]/div[7]/div[1]/div[1]/span/i[1]/text()')[0]  # 通过xpath获取网页关键词总数的值
        print(num2)                           # 输出获取的值
        num2 = int(num2)                      # 将值类型转化为int
        num2 = str(num2)                      # 将值类型转化为str
        print('关键词数:' + num2)              # 打印关键词数
        num2 = int(num2)
        if num2 <= 200:                       # if num2<=200,原值返回
            num2 = int(num2)
        elif num2 >= 1000:                    # if num2>=1000,赋值为1
            num2 = 1
        else:
            num2 = 200                        # else num2=200

    except:
        print("该网站没有关键词")                # if没有获取到值则显示无关键词
        pass                                  # 用pass防止报错
    return num2                               # 返回最终关键词总数num2


# 获取爬取的关键词
def getdata(word):
    word = word      # URL
    num2 = num(word)  # 获取关键词总数
    num2 = num2 / 20  # 获取页数
    num3 = math.ceil(num2)   # 去除小数取整
    num3 = str(num3)  # 转化为str
    print('页面数:' + num3) # 输出总页数
    num3 = int(num3)
    Datalist = []  # 用来存储已经经过处理的信息
    print("{:^20}\t{:^12}\t{:^12}\t".format('关键词', '指数', '排名'))   # 打印表头
    for i in range(0, num3):  # 在1-num3页内爬取关键词的信息
        i = i + 1             # i + 1 用于翻页操作
        i = str(i)
        url = 'http://rank.chinaz.com/' + word + '-0---0-' + i  # 这个根据网页的翻页特点 站长工具网址翻页后参数变化是每页的数字+1
        data = ask_url(url)  # 获取到源代码
        data = data.decode('utf-8')    # 将数据进行utf-8编码
        # 从源代码中提取信息
        if data != "":
            html_data = etree.HTML(data)  # 解析网页
            # 使用xpath定位到全部要获取的内容   然后在这个里面循环提取
            div_list = html_data.xpath('//ul[@class="_chinaz-rank-new5b"]')
            for item in div_list:
                data_item = []  # 在循环里面建立一个空的列表存储关键词一页的全部数据
                # 关键词
                movie_rank = item.xpath('li[1]//a[1]//text()')[0]
                data_item.append(movie_rank)
                # PC指数
                movie_name = item.xpath('li[4]//text()')[0]
                data_item.append(movie_name)
                # 排名
                paiming = item.xpath('li[2]//a//text()')[0]
                data_item.append(paiming)

                print("{:^20}\t{:^8}\t{:^8}\t".format(movie_rank, movie_name, paiming))
                # 先将一行的数据存储在data_item中,再将data_item存入Datalist
                Datalist.append(data_item)
    return Datalist


# 将html获取的信息存入Excel表格中
def savedata(Datalist, Savapath):
    col = ("关键词", "PC指数", "排名")  # Excel的表头 也就是列数
    house_list = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象
    worksheet = house_list.add_sheet("同行网站关键词", cell_overwrite_ok=True)  # 新建工作区,设为可覆盖
    for i in range(0, 3):  # 写入表头 一共3列
        worksheet.write(0, i, col[i])  # 写入表头 一共3列
    try:
        for i in range(0, num2):  # 写入数据  也就是行数 num2为总行数
            print("正在写入第%d条数据" % (i + 1))
            item = Datalist[i]  # 获取的数据的索引
            for j in range(0, 3):  # 列数
                worksheet.write(i + 1, j, item[j])  # i + 1是从第1行开始写 第0行被表头占用了  item[j]将数据按照数据的索引进行写入
        house_list.save(Savapath)  # 存储
    except:
        print('存入Execl失败')
        pass

# 读取文本中关键词
def lead_keywords():
    print('>> 正在导入关键词列表..')
    try:
        with open('./url_list.txt', 'r', encoding='gbk') as f:  # 打开文本
            keywords = f.readlines()         # 按行读取关键词
    except:
        with open('./url_list.txt', 'r', encoding='utf-8') as f:
            keywords = f.readlines()

    print(keywords)
    print('>> 正在导入关键词列表成功!')

    return keywords


# 主函数
def seomain():
    words = lead_keywords()  # 从文本中导入批量URL
    for word in words:       # 循环URL
        word.strip()         # 对URL去除空格
        word = word.replace("\n", "")  # 对URL去除换行符
        star_time = time.time()   # 开始时间
        print(word)               # 输出当前执行的URL
        filename = str(word + datetime.datetime.now().strftime('%Y%m%d-%H-%M-%S'))  # 形成文件名(URL+系统时间)
        try:
            main(word, filename)    # 执行main()函数,将(URL,文件名)传入main()函数
            end_time = time.time()  # 结束时间
            print("爬取完毕! 一共耗时: %.2f秒" % (end_time - star_time))  # 打印耗时
        except:
            pass
    print('已写入Execl到程序当前目录下,文件名为系统时间.xls')
    time.sleep(10)   # 停止10秒
    
# 程序入口
if __name__ == '__main__':
    seomain()  # 执行主函数

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Python数据转化为Excel格,并带有多个头,可以使用Python的pandas库。 下面是一个简单的例子,假设我们已经了一些数据数据以列的形式存储: ```python data = [['John', 25, 'Male', 'USA'], ['Sarah', 30, 'Female', 'Canada'], ['Bob', 40, 'Male', 'UK']] ``` 我们可以用pandas将数据转换为DataFrame对象: ```python import pandas as pd df = pd.DataFrame(data, columns=['Name', 'Age', 'Gender', 'Country']) ``` 在这个例子,我们定义了四个头:Name、Age、Gender和Country。现在我们可以将这个DataFrame对象写入到Excel文件: ```python writer = pd.ExcelWriter('data.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) writer.save() ``` 在这个例子,我们使用了xlsxwriter引擎将数据写入到Excel文件。我们还将sheet_name设置为'Sheet1',并将index设置为False,这样就不会在Excel文件生成默认的索引列。 如果我们想要在Excel文件包含多个头,可以使用pandas的MultiIndex对象。例如,假设我们想要在Excel文件包含两个头:Name和Personal Information,可以使用以下代码: ```python header = pd.MultiIndex.from_tuples([('Name', ''), ('Personal Information', 'Age'), ('Personal Information', 'Gender'), ('Personal Information', 'Country')]) df.columns = header writer = pd.ExcelWriter('data.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) writer.save() ``` 在这个例子,我们首先使用MultiIndex对象定义了两个头:Name和Personal Information,并在Personal Information头下定义了三个子头:Age、Gender和Country。然后,我们将这个MultiIndex对象赋值给DataFrame的columns属性,以更新DataFrame的头。最后,我们将DataFrame写入到Excel文件,并将sheet_name设置为'Sheet1'。 这样,我们就可以在Excel文件看到两个头了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值