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之有点简约的元组
Sep 24 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 Python
学Python 3的理由和必要性
Nov 19 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
Python3.10的一些新特性原理分析
Sep 15 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
图书管理程序(三)
2006/10/09 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
PHP中比较时间大小实例
2014/08/21 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
php简单生成随机数的方法
2015/07/30 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JavaScript高级程序设计
2006/12/29 Javascript
pjblog修改技巧汇总
2007/03/12 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
Python切片知识解析
2016/03/06 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
详解python中的装饰器
2018/07/10 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
汽车维修专业个人求职信范文
2014/01/01 职场文书
财产保全担保书范文
2014/04/01 职场文书
cf战队收人口号
2014/06/21 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
ant design vue的form表单取值方法
2022/06/01 Vue.js
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技