import re#(用于匹配正则方法,匹配想要的内容)
import requests#(用请求的方式去获取网页的内容)
from time import sleep
from lxml import etree #(形成可被检索的对象)
import xlwings as ex #(很方便进行excel的写入但是没办法自定义列宽和高度等设置)
import time
path=r"C:\Users\c-xieww01\Desktop"#设置文件储存路径
url='https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/18363697?fromtitle=%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8&fromid=22517755&fr=aladdin#1' #爬取的网页url
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44"}#设置请求头,有些爬虫会对请求的用户进行拦截,设置了请求头就可以了
print("数据爬取开始")
r = requests.get(url=url,headers=header)# 发送get请求
title = etree.HTML(r.text)#把请求的内容放在etree中生成可悲检索的对象
print("数据已经获取")
l=""#定义一个空字符串
list1=[]#定义一个空列表
text = title.xpath('//div[@class="para" and @label-module="para"]//text()')#获取title中所有是div标签并且class的值为para,label-module值为para的内容以及下级标签的所有文本内容,得到的内容是一个列表
for i in text:
if '[' in i :
text.remove(i)
text="".join(text)#将text列表里的元素以空字符串连接起来,并去掉[\d]这个字符串
text=re.sub(r'[\n|" "|\xa0]','',text,flags=re.S)
m=""#定义一个空字符串
a=0#因为有很多个"。",";"所以组要记住上一次选择的是哪个
#将目标字符串按照网页展示的去换行
for i in text:
b=len(text)#计算目标文档的长度

if i=="。" or i==";" or i==";" or i=="。" or i == "%" :
a = text.index(i, a + 1, b)

if text[a+1]not in ("。",";" ,"。") and text[a+2] not in ("。",";" ,"。") :
if text[a+1].isdigit() or text[a+2].isdigit() or text[a+3].isdigit() or text[a+1:a+10]=='2022年6月13日':
i=i+"\n"
elif i==" ":
pass
else:
pass
if i=="收" :
a = text.index(i, a + 1, b)
if text[a+1]=="入":
i=","+i
if i == "日":
a = text.index(i, a + 1, b)
if text[a+1]=="下":
i = i+ ","
m=m+i
text=m

text=re.findall("2012年3月,北京字节跳动科技有限公司成立.*2022年5月6日,北京字节跳动科技有限公司更名为北京抖音信息服务有限公司。",text,re.S)#正则匹配在规定文字内的内容返回的是一个符合条件的列表集合
text=text[0]+'\n' #获取列表中的字符串
#自定义一个迭代器
class str_iter():
def __init__(self,end,text):
self.end=end
self.start=0
self.text=text
self.start1=0
def __iter__(self):
return self
def __next__(self):
try:
self.start1=text.index('\n',self.start1+1)
except:
pass
self.a=text[self.start:self.start1]
self.start=self.start1
return self.a
try:
app = ex.App(visible=True, add_book=False)
wb = app.books.open(fr"{path}\爬虫.xlsx")
sheet = wb.sheets.active
except Exception:
wb = app.books.add()
wb.save(fr"{path}\爬虫.xlsx")
wb = app.books.open(fr"{path}\爬虫.xlsx")
sheet = wb.sheets.active
hang=0
nu=str_iter(len(text),text)
print("正在存储中请稍后...")
t = 35
start = time.perf_counter()
for i in range(36):
finsh = "▓" * i
need_do = "-" * (t - i)
progress = (i / t) * 100
j=next(nu)
list2=j.split(",",1)
# print(list2)
hang+=1
wb.sheets["sheet1"].range(f"A{hang}").value=[list2[0],list2[1]]
sleep(0.2)
sheet.range(f"A{hang}").color = (255, 235, 157)
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(progress, finsh, need_do, dur), end="")
print("\n数据储存完毕,正在调整格式请稍后...")
sheet.range(f"A{hang}").row_height=90
sheet.range(f"A{hang}").column_width = 20
sheet.range(f"B{hang}").column_width=50
sheet.range(f"B{hang}").row_height = 90
print("格式已设置,正在关闭excel请稍后...")
sleep(3)
wb.save()
app.quit()
print(f"存储完毕已在{path}\爬虫.xlsx")