网络数据采集-读取文档

本次主要介绍爬虫读取纯文本,PDF,图像,视频,邮件等文件,以及如何把文件下载到指定的文件夹,读取并提取数据,介绍文档的不一样编码类型,让程序能够读取非英文的html页面。html

文档编码是告诉程序读取文档的规则。文档编码的规则一般能够根据文件的扩展名进行判断。一般的文档格式有纯文本,PDF,PNG,CIF等。python

1.纯文本

把文件存储为纯文本格式的形式如今并很少,http://www.pythonscraping.com/pages/warandpeace/chapter1.txt 就是一个纯文本存储的例子,读取时只须要使用urlopen打开便可,不须要使用beautifulsoup。由于这个页面不是html。api

from urllib.request import urlopen
textPage = urlopen("http://www.pythonscraping.com/pages/warandpeace/chapter1.txt")
print(textPage.read())

2.文档编码

全球统一的编码格式UTF-8,并非存储为8位,8位只能存储256个字符,显然是不够的.UTF-8每一个字符的开头都是标识这个字符用了多少字节,一个字符最多使用4字节。大部分网站是使用UTF-8的,有一小部分欧洲网站采用ISO编码,能够在网页的首部查看:网络

<meta charset="utf-8" />
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

正确的读取UTF-8文档(如俄文):函数

from urllib.request import urlopen
textPage = urlopen("http://www.pythonscraping.com/pages/warandpeace/chapter1-ru.txt")
print(str(textPage.read(), 'utf-8'))

3.CSV

在进行网络数据采集,有时候须要采集csv格式的数据或者须要把数据存为csv格式。python中有一个库对csv的支持很是好。 http://docs.python.org/3.4/library/csv.html 读取csv有三张解决方法: 1.手动下载csv到本地,用python定位信息位置 2.用python程序下载csv文件,读取后删除文件 3.把文件读取为字符串,而后转换为一个StringIO对象,使他具备文件的属性。 建议使用方法3.下面程序是从网上得到一个CSV文件,而后打印到命令行。网站

from urllib.request import urlopen
from io import StringIO
import csv

data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode('ascii', 'ignore')
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)

for row in csvReader:
    print(row)

输出结果是:编码

['Name', 'Year']
["Monty Python's Flying Circus", '1970']
['Another Monty Python Record', '1971']
["Monty Python's Previous Record", '1972']
...

返回的是一个列表,能够使用下面的方法进行处理:url

for row in csvReader:
print("The album \""+row[0]+"\" was released in "+str(row[1]))

返回的结果是:命令行

The album "Name" was released in Year
The album "Monty Python's Flying Circus" was released in 1970
The album "Another Monty Python Record" was released in 1971
The album "Monty Python's Previous Record" was released in 1972
...

4.PDF

PDFMiner3K是一个很是好用的库(PDFMiner的python3移植版),很是灵活,能够经过命令行调用也能够使用代码调用,可以处理不一样语言的编码,能够便利的处理网络文件。 下载安装:https://pypi.python.org/pypi/pdfminer3k 解压并用下面命令安装:code

python setup.py install

参考文档在解压后的文件夹中:/pdfminer3k-1.3.0/docs/index.html

下面的程序能够把任意PDF读取成字符串,而后用StringIO转换成文件对象。

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
from io import open

def readPDF(pdfFile):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    process_pdf(rsrcmgr, device, pdfFile)
    device.close()
    content = retstr.getvalue()
    retstr.close()
    return content

pdfFile = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf")
outputString = readPDF(pdfFile)
print(outputString)
pdfFile.close()

定义了一个readPDF函数,当想要读取本地pdf时,能够直接使用open函数便可。

pdfFile = open("../pages/warandpeace/chapter1.pdf", 'rb')

5.word与docx

从docx文件中读取xml

from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO

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'))

转换后的文档内都包含在<w:t>中,使用下面代码提取:

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')

wordObj = BeautifulSoup(xml_content.decode('utf-8'))
textStrings = wordObj.findAll("w:t")

for textElem in textStrings:
    print(textElem.text)
相关文章
相关标签/搜索