python网络爬虫入门(四、采集单一网页特定数据)

一、采集标题和文本

#一、文本采集
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")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值