python爬取各类文档方法归类汇总
作者:hhhparty 发布时间:2022-02-22 05:45:47
HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、Excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息,也需要有抓取其他类型文档的能力。下面简要记录一些个人已知的基于python3的抓取方法,以备查阅。
1.抓取TXT文档
在python3下,常用方法是使用urllib.request.urlopen方法直接获取。之后利用正则表达式等方式进行敏感词检索。
### Reading TXT doc ###
from urllib.request import urlopen
from urllib.error import URLError,HTTPError
import re
try:
textPage = urlopen("http://www.pythonscraping.com/pages/warandpeace/chapter1.txt")
except (URLError,HTTPError) as e:
print("Errors:\n")
print(e)
#print(textPage.read())
text = str(textPage.read())
#下面方法用正则匹配含1805的句子
pattern = re.compile("\..*1805(\w|,|\s|-)*(\.)")#不完美,简单示例
match = pattern.search(text)
if match is not None:
print(match.group())
#下面方法不用正则。先用.将句集分片,之后就可遍历了。
ss = text.split('.')
key_words = "1805"
words_list = [x.lower() for x in key_words.split()]
for item in ss:
if all([word in item.lower() and True or False for word in words_list]):
print(item)
上面的方法是已知目标网页为txt文本时的抓取。事实上,在自动抓取网页时,必须考虑目标网页是否为纯文本,用何种编码等问题。
如果只是编码问题,可以简单使用print(textPage.read(),'utf-8')等python字符处理方法来解决,如果抓取的是某个HTML,最好先分析,例如:
from urllib.request import urlopen
from urllib.error import URLError,HTTPError
from bs4 import BeautifulSoup
try:
html = urlopen("https://en.wikipedia.org/wiki/Python_(programming_language)")
except (URLError,HTTPError) as e:
print(e)
try:
bsObj = BeautifulSoup(html,"html.parser")
content = bsObj.find("div",{"id":"mw-content-text"}).get_text()
except AttributeError as e:
print(e)
meta = bsObj.find("meta")
#print(bsObj)
if meta.attrs['charset'] == 'UTF-8':
content = bytes(content,"UTF-8")
print("-----------------UTF-8--------------")
print(content.decode("UTF-8"))
if meta.attrs['charset'] == 'iso-8859-1':
content = bytes(content,"iso-8859-1")
print("--------------iso-8859-1------------")
print(content.decode("iso-8859-1"))
2.抓取CSV文档
CSV文件是一种常见的数据存档文件,与TXT文档基本类似,但在内容组织上有一定格式,文件的首行为标题列,之后的文件中的每一行表示一个数据记录。这就像一个二维数据表或excel表格一样。 python3中包含一个csv解析库,可用于读写csv文件,但其读取目标一般要求是在本地,要读取远程网络上的csv文件需要用urllib.request.urlopen先获取。例如:
#csv远程获取,内存加载读取
from urllib.request import urlopen
import csv
from io import StringIO#在内存中读写str,如果要操作二进制数据,就需要使用BytesIO
try:
data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode("ascii","ignore")
except (URLError,HTTPError) as e:
print("Errors:\n")
print(e)
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)
count = 0
for row in csvReader:
if count < 10:
print(row)
else:
print("...\n...")
break
count += 1
#将数据写入本地csv文件
with open("./localtmp.csv","wt",newline='',encoding='utf-8') as localcsvfile:
writer = csv.writer(localcsvfile)
count = 0
try:
for row in csvReader:
if count < 10:
writer.writerow(row)
else:
break
count += 1
finally:
localcsvfile.close()
csv文档的标题行(首行)需要特殊处理,csv.DictReader可以很好的解决这个问题。DictReader将读取的行转换为python字典对象,而不是列表。标题行的各列名即为字典的键名。
#csv.DictReader读取csv文件,可以有效处理标题行等问题
from urllib.request import urlopen
import csv
from io import StringIO#在内存中读写str,如果要操作二进制数据,就需要使用BytesIO
try:
data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode("ascii","ignore")
except (URLError,HTTPError) as e:
print("Errors:\n")
print(e)
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)
dictReader = csv.DictReader(dataFile)
print(dictReader.fieldnames)
count = 0
for row in dictReader:
if count < 10:
print(row)
else:
print("...\n...")
break
count += 1
3.抓取PDF文档
pdf文档的远程抓取与操作,可借助比较流行的pdfminer3k库来完成。
#抓取并操作pdf
#pdf READ operation
from urllib.request import urlopen
from pdfminer.pdfinterp import PDFResourceManager,process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO,open
def readPDF(filename):
resmgr = PDFResourceManager()#STEP 1
retstr = StringIO()#STEP 2
laparams = LAParams()#STEP 3
device = TextConverter(resmgr,retstr,laparams=laparams)#STEP 4
process_pdf(resmgr,device,filename)#STEP 5
device.close()#STEP 6
content = retstr.getvalue()
retstr.close()
return content
try:
pdffile = urlopen("http://www.fit.vutbr.cz/research/groups/speech/servite/2010/rnnlm_mikolov.pdf")
except (URLError,HTTPError) as e:
print("Errors:\n")
print(e)
outputString = readPDF(pdffile)#也可以读取由pdffile=open("../../readme.pdf")语句打开的本地文件。
print(outputString)
pdffile.close()
4.抓取WORD
老版word使用了二进制格式,后缀名为.doc,word2007后出现了与OPEN OFFICE类似的类XML格式文档,后缀名为.docx。python对word文档的支持不够,似乎没有完美解决方案。为读取docx内容,可以使用以下方法:
(1)利用urlopen抓取远程word docx文件;
(2)将其转换为内存字节流;
(3)解压缩(docx是压缩后文件);
(4)将解压后文件作为xml读取
(5)寻找xml中的标签(正文内容)并处理
#读取word docx文档内容
from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO
from bs4 import BeautifulSoup
wordFile = urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read()
wordFile = BytesIO(wordFile)
document = ZipFile(wordFile)#
xml_content = document.read("word/document.xml")
#print(xml_content.decode("utf-8"))
wordObj = BeautifulSoup(xml_content.decode("utf-8"),"lxml")
textStrings = wordObj.findAll("w:t")
for textElem in textStrings:
print(textElem.text)
5.抓取EXCEL
6.抓取HTML源文档
7.抓取HTML表单数据
8.抓取Javascript数据
更多内容请参考专题《python爬取功能汇总》进行学习。
来源:https://blog.csdn.net/hhhparty/article/details/54917327
猜你喜欢
- 游戏规则用pygame动画实现神庙逃亡类似的小游戏,当玩家移动的时候躲避 * ,如果 * 命中玩家或者名字龙都会减速,玩家躲避 * 使更多的 * 打
- 文件下载(遇到的坑)1.要区分下载的内容是什么0.1 图片下载wx.saveImageToPhotosAlbum(Object
- 今天我们来写一个有管理功能的留言板程序。所谓的管理功能,其实就是每条留言前有一个选择框,点中要删除的留言,或者点“删除所有留言”,就完成了批
- 本文实例讲述了Python基于pygame实现的font游戏字体。分享给大家供大家参考,具体如下:在pygame游戏开发中,一个友好的UI中
- 本文给出了MySQL数据库中定义外键的必要性、具体的定义步骤和相关的一些基本操作,供大家参考!定义数据表假如某个电脑生产商,它的数据库中保存
- 主要原理:调整dicom的窗宽,使之各个像素点上的灰度值缩放至[0,255]范围内。使用到的python库:SimpleITK下面是一个将d
- 一、python logging日志模块简单封装项目根目录创建 utils/logUtil.pyimport loggingfrom log
- 虽然大多数web文档的顶部都有doctype声明,但很多人都没有注意它。它是在你新建一个文档时,由web创作软件草率处理的众多细节之一。虽然
- Python 通过pip安装Django详细介绍经过前面的 Python 包管理工具的学习,接下来我们就要基于前面的知识,来配置 Djang
- 控制结构就是for,while,if-else,if-elif,while…else,在web.py中其实和我们以前学过的一样,操作基本是相
- 前两天看的时候,所用的歌曲地址加密方式已变更。将以前的发出来供大家赏玩。解密函数是从flash里面反编译出来的,加密函数是自己根据解密函数写
- 导读:这篇文章主要介绍如何利用opencv来对图像添加各类噪声,原图:1、高斯噪声高斯噪声就是给图片添加一个服从高斯分布的噪声,可以通过调节
- 这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 当使用pytorch写网络结构的时候,本人发现在卷积层与第一个全连接层的全连接层的input_features不知道该写多少?一开始本人的做
- 前言在应用程序开发的过程中,有的时候需要在代码中保存一些机密的信息,比如加密密钥,字符串,或者是用户名密码等。通常的做法是保存到一个配置文件
- 1、工厂模式在面向对象编程中,工厂模式是开发过程中最常用的设计模式之一,属于创建型模式,就是通过一个接口函数或对象来创建其他对象并返回,该模
- 本文实例讲述了Python基于pyCUDA实现GPU加速并行计算功能。分享给大家供大家参考,具体如下:Nvidia的CUDA 架构为我们提供
- 学习前言最近在学目标检测……SSD的源码好复杂……看
- object.OpenTextFile(filename[, iomode[, create[, format]]]) 参数 object
- 我用FSO生成了unicode的文件,但这不是我想要的。FSO可以生成utf-8格式编码的html文件吗?用什么办法才能生成?FSO的编码问