版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、采集标题和文本
#一、文本采集
import requests
from bs4 import BeautifulSoup
import re
import os
import pandas as pd
#一、解析文件
url="http://www.jjwxc.net/onebook.php?novelid=4328853&chapterid=10"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:70.0)"+"Gecko/20100101 Firefox/70.0"} #设置请求头
r=requests.get(url,headers=headers)
html=r.text.encode(r.encoding).decode("GBK")
soup=BeautifulSoup(html,"lxml")
#二、清洗数据
title=soup.find("div",align="center").h2.text
content=soup.find("div",class_="noveltext").text
content=re.sub("(\r|\n|\u3000|\xa0)","",content) #出去换行标记等等
content=re.sub("插入书签","",content)
content=re.sub("电子书下载TXT下载举报色情反动举报刷分其他文章收藏 为收藏文章分类定制收藏类别查看收藏列表群狼突围","",content)
content=re.sub("\[.*\]","",content) #懒惰匹配 *? : 1.找最近的()匹配
content=re.sub(" "," ",content)
content
#三、存储到txt文档
filedir=os.getcwd()+"/《204病房》" #1.创建路径
if not os.path.exists(filedir): #2.创建目录
os.mkdir(filedir)
with open(filedir+"/%s.txt"%title,mode="w",encoding="utf-8") as f: #打开文件,放入内容
f.write(title+"\n"+content)
二、采集博客中的图片
import requests
from bs4 import BeautifulSoup
import re
import os
import pandas as pd
#一.获取html文本
url="https://www.jianshu.com/p/1376959c3679"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:70.0)"+"Gecko/20100101 Firefox/70.0"} #设置请求头
r=requests.get(url,headers =headers)
html=r.text.encode(r.encoding).decode()
#二.筛选图片对应的链接下载地址,装入集合
soup=BeautifulSoup(html,"lxml")
imgs=soup.findAll(lambda tag:tag.name=="img" #标记名为img且含有data-original-src
and tag.has_attr("data-original-src"))
srcs =[i.attrs["data-original-src"] for i in imgs] #从字典提取非完整链接
sources =["https:" +src for src in srcs] #组装成完整链接
#三.创建文件夹保存图片
#1创建文件夹
filedir= os.getcwd()+"/户外风景独好"
if not os.path.exists(filedir):
os.mkdir(filedir)
#2遍历图片地址集合,发送请求
for i in range(len(sources)):
rpi= requests.get(sources[i],headers=headers)
if rpi.status_code ==200: #判断是否请求成功
with open(filedir+"/%s.jpg"%i,mode="wb") as f: #打开文件,并以wb二进制形式填写
f.write(rpi.content) #写入请求的内容
print("正在下载第%d张图片。。。。。。"%i)
三、采集表格型数据
import requests
from bs4 import BeautifulSoup
import re
import os
import pandas as pd
import numpy as np
#一.获取html文本
url="https://rl.fx678.com/date/20171229.html"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:70.0)"+"Gecko/20100101 Firefox/70.0"} #设置请求头
r=requests.get(url,headers =headers)
html=r.text.encode(r.encoding).decode()
soup=BeautifulSoup(html,"lxml")
#二.采集表格数据
#1.对应的行数(tr中存在td表示一行数据)
table=soup.find("table",id="current_data") #获取表格tag
height=len(table.findAll(lambda tag:tag.name=="tr" and len(tag.findAll("td"))>=1))
#2.查看每行有多少列
for row in table.findAll("tr"): #找出的tr标签
print(len(row.findAll("td")),end="\t") #找出对应td个数,即为列数
#3.收集表头
columns=[x.text for x in table.tr.findAll("th")] #遍历表的所有tr标签找出所有的th标签 然后获取文本
columns=[x.replace("\xa0"," ") for x in columns] #清洗数据
#三、构造dataFrame 准备存储表格
width=len(columns) #定义列数
df=pd.DataFrame(data=np.full((height,width)," ",dtype="U"),columns=columns) #定义行列数据总数,定义列标题
rows=[row for row in table.findAll("tr") if row.find("td")!=None] #提取所有的tr标签,当td不为空时
#四、逐行解析表格
for i in range(len(rows)): #遍历所有的行
cells=rows[i].findAll("td") #提取每一行td数据标签
#如果对应的td个数等于属性
if len(cells)==width: #学会从错误提示本身寻找错误
df.iloc[i]=[cell.text.replace(" ","") #数据清洗,清洗掉\n和空格
.replace("\n","") for cell in cells] #填入对应的文本,到对应的行
#若单元跨多行,则进行多行操作填充
for j in range(len(cells)): #遍历每一列
if cells[j].has_attr("rowspan"): #如果存在行块
z=int(cells[j].attrs["rowspan"]) #将rowspan的宽度转化为int
df.iloc[i:i+z,j]=[cells[j].text.replace(" ","").replace("\n","")]*z#将对应的i-i+z行,第j列进行进行填充,都填充相同的数据
else:
w=len(cells) #测量出对应的长度
df.iloc[i,width-w:]=[cell.text.replace(" ","") #减去前两格长度,对后面进行复制
.replace("\n","") for cell in cells] #填充数据
#五、保存文件
df.to_excel("20171229财经日历.xlsx")