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


猜你喜欢
- python中ftplib模块支持ftp操作,主要使用FTP类。本文使用ftp操作进行连接FTP服务器、获取当前目录文件清单、上传文件等操作
- 原因:使用git clone项目后,项目根路径是小写英文名称,比如cmdbapi,但是项目里面的import导入自己的相关包时,红色报错解决
- 有个帖子写的检查全角的 <script> fun
- 接着上一篇,这里继续整合交易类。import datetime#交易类,后期需要整合公钥,私钥class Transaction: &nbs
- hashlib 模块hashlib 模块的介绍hashlib 模块中拥有很多的加密算法,我们并不需要关心加密算法的实现方法。只需要调用我们需
- 程序开始:<% Server.ScriptTimeout = &HE10 '&
- 在matplotlib官网看到了第三方库numpngw的简介,利用该库作为插件可以辅助matplotlib生成png动画。numpngw概述
- 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组
- 练手项目,先上图先实现一个简单的串口工具,为之后的上位机做准备代码如下:github 下载地址pyserial_demo.pyimport
- 在了解了XHTML 2的进展之后,我们再来看看X/HTML 5 的进展。X/HTML 5酷在什么地方章节元素的构想X/HTML 5引入新的元
- Go+ 语言的安装和环境配置有些复杂,官方教程也没有写的很详细。通过控制台编写和运行 Go+ 程序很不方便。本文从零开始,详细介绍 Go+
- python去除列表中的空值元素实战技巧产生需求的原因:最近都在使用python做一些小demo,尤其是经常会用python做一些关于数据处
- 请问如何在ASP中使用ADO调用Oracle的存储过程?我们可以在下面的代码里使用微软Oracle 的OLE DB Provider ,包括
- 操作系统上正确配置python环境之后,pyuic5也是一个可以识别的命令行指令到.ui文件的目录下,直接cmd进入,输入pyuic5 -o
- 1 类继承Python 是面向对象的编程语言,因此支持面向对象的三大特性之一:继承。继承是代码重用的一种途径,Python 中的继承就像现实
- 这里inference两个程序的连接,如目标检测,可以利用一个程序提取候选框,然后把候选框输入到分类cnn网络中。这里常需要进行一定的连接。
- 在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数判断文本
- 当浏览网页时,总有那么一类网站华丽而富有趣味性。在浏览信息的同时,足够让我们眼前一亮。它们在充分融入动画、视频、游戏、甚至是与众不同的交互操
- 在Twinsen Liang的博客上看到一篇名为语义化单单的限定在html么?的文章,文中主要是提及了CSS的命名规则,仔细阅读后,我认为这
- linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题。 解决mysql导入导出数据乱码问