Python3+Selenium3+openpyxl 爬取网站信息并保存到excel
前言
提示:以下是本人小白自行研究的成果,仅供参考
一、openpyxl安装
cmd 输入 pip3 install openpyxl
pip3 install openpyxl
这个可能慢点,也可以使用豆瓣源或者清华大学源下载
# 豆瓣
pip3 install openpyxl -i https://pypi.douban.com/simple
# 清华大学
pip3 install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
看到Successfully就表示成功了
二、读取2021年最火歌曲并保存到excel
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import re
from selenium import webdriver
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
'''
读取2021年最火歌曲,并保存到excel
'''
num0 = 1
num1 = 1
maxlen1 = 1
maxlen2 = 1
workbook = Workbook()
sheetsh = workbook.active
sheetsh.title = '2021最火歌曲'
sheetsh.cell(row=1, column=1).value = '排名'
sheetsh.cell(row=1, column=2).value = '链接'
sheetsh.cell(row=1, column=3).value = '歌名'
url = 'https://www.9ku.com/music/t_hits.htm'
def getHtml():
# 打开谷歌浏览器
driver = webdriver.Chrome()
# 打开热搜歌曲网站
driver.get(url)
# driver.get("https://www.baidu.com/")
time.sleep(3)
js = 'window.scrollBy(0,3000)'
# 调用js方法
driver.execute_script(js)
js = 'window.scrollBy(0,5000)'
driver.execute_script(js)
# 获取整个页面的元素信息
html = driver.page_source
return html
col_width = [0] * 3
def parseHotBook(html):
# 这里有跨行,但我用\n一直处理不了就分开写了
# 大致解说:()里面的是会自动匹配计入结果,反之则只匹配不计入结果;
# .*?:匹配所有字符串(非贪婪模式);
# r'':表示字符串是非转义的原始字符串,需编译器忽略转义字符
reg_rank = re.compile(r'<span class="songNum.*?">(.*?).</span>')
reg_name = re.compile(r'<a target="_1" href="(.*?)" class="songName.*?">(.*?)</a>')
result_rank = re.findall(reg_rank, html)
result_name = re.findall(reg_name, html)
# global 全局变量
global num0, num1, maxlen1, maxlen2
for info in result_rank:
num0 = num0 + 1
sheetsh.cell(row=num0, column=1).value = info
if maxlen1 < len(info):
maxlen1 = len(info)
col_width[0] = maxlen1 + 4
for info in result_name:
num1 = num1 + 1
sheetsh.cell(row=num1, column=2).value = 'https://www.9ku.com' + info[0]
sheetsh.cell(row=num1, column=3).value = info[1]
if maxlen1 < len(info[0]) + 19:
maxlen1 = len(info[0]) + 19
col_width[1] = maxlen1 + 4
if maxlen2 < len(info[1]):
maxlen2 = len(info[1])
# 一个汉字对应两个字节,所以这个*2, +4是我预留的空间
col_width[2] = maxlen2 * 2 + 4
# 设置自适应列宽
for col in sheetsh.columns:
# 获取列序号
index = list(sheetsh.columns).index(col)
# 获取列字母
letter = get_column_letter(index + 1)
print(col_width[index])
# 设置列宽
sheetsh.column_dimensions[letter].width = col_width[index]
# 如果不写路径则默认保存在项目路径下
workbook.save('E://2021最火歌曲.xlsx')
print('爬取成功!!!')
if __name__=='__main__':
html = getHtml()
parseHotBook(html)
解说:
上文用的是 re.findall(),表示匹配所有的字符串并返回列表,为空则返回空列表
另外re.match()与re.search()
match 只匹配字符串的起始位置的,如不匹配则返回none
search 扫描整个字符串并返回第一个成功的匹配
re.compile() 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。使用方式参考上面代码。
关于这几个函数以及正则表达式有不懂的,看这个 https://www.runoob.com/python/python-reg-expressions.html超完整哦
总结
小白学习,不足之处欢迎指出,共同探讨