侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   201

HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、Excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息,也需要有抓取其他类型文档的能力。下面简要记录一些个人已知的基于python3的抓取方法,以备查阅。

1.抓取TXT文档

在python3下,常用方法是使用urllib.request.urlopen方法直接获取。之后利用正则表达式等方式进行敏感词检索。

### Reading TXT doc ###from urllib.request import urlopenfrom urllib.error import URLError,HTTPErrorimport retry: 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 urlopenfrom urllib.error import URLError,HTTPErrorfrom bs4 import BeautifulSouptry: 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 urlopenimport csvfrom io import StringIO#在内存中读写str,如果要操作二进制数据,就需要使用BytesIOtry: 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 = 0for 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 urlopenimport csvfrom io import StringIO#在内存中读写str,如果要操作二进制数据,就需要使用BytesIOtry: 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 = 0for row in dictReader: if count < 10:  print(row) else:  print("...\n...")  break count += 1 

3.抓取PDF文档

pdf文档的远程抓取与操作,可借助比较流行的pdfminer3k库来完成。

#抓取并操作pdf#pdf READ operationfrom urllib.request import urlopenfrom pdfminer.pdfinterp import PDFResourceManager,process_pdffrom pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom io import StringIO,opendef 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 contenttry: 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 ZipFilefrom urllib.request import urlopenfrom io import BytesIOfrom bs4 import BeautifulSoupwordFile = 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正则表达式 findall函数问题详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客