#一、文本采集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.创建路径ifnot os.path.exists(filedir):#2.创建目录
os.mkdir(filedir)withopen(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-srcand 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()+"/户外风景独好"ifnot os.path.exists(filedir):
os.mkdir(filedir)#2遍历图片地址集合,发送请求 for i inrange(len(sources)):
rpi= requests.get(sources[i],headers=headers)if rpi.status_code ==200:#判断是否请求成功withopen(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"andlen(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 inrange(len(rows)):#遍历所有的行
cells=rows[i].findAll("td")#提取每一行td数据标签#如果对应的td个数等于属性iflen(cells)==width:#学会从错误提示本身寻找错误
df.iloc[i]=[cell.text.replace(" ","")#数据清洗,清洗掉\n和空格.replace("\n","")for cell in cells]#填入对应的文本,到对应的行 #若单元跨多行,则进行多行操作填充for j inrange(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")