python爬取各类文档方法归类汇总


Posted in Python onMarch 22, 2018

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爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单的抓取淘宝图片的Python爬虫
Dec 25 Python
详谈python中冒号与逗号的区别
Apr 18 Python
python 实现登录网页的操作方法
May 11 Python
pycharm安装和首次使用教程
Aug 27 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
python__name__原理及用法详解
Nov 02 Python
Python如何使用函数做字典的值
Nov 30 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
python小白切忌乱用表达式
May 29 Python
记一次django内存异常排查及解决方法
Aug 07 Python
关于Python正则表达式 findall函数问题详解
Mar 22 #Python
Django自定义过滤器定义与用法示例
Mar 22 #Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
Mar 22 #Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 #Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 #Python
python实现将excel文件转化成CSV格式
Mar 22 #Python
python 对象和json互相转换方法
Mar 22 #Python
You might like
用php将任何格式视频转为flv的代码
2009/09/03 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
php判断目录存在的简单方法
2019/09/26 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
Django web框架使用url path name详解
2019/04/29 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Python调用飞书发送消息的示例
2020/11/10 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
《望洞庭》教学反思
2014/02/16 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
暑期家教宣传单
2015/07/14 职场文书
公司周年庆寄语
2019/06/21 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技