本次主要介绍爬虫读取纯文本,PDF,图像,视频,邮件等文件,以及如何把文件下载到指定的文件夹,读取并提取数据,介绍文档的不一样编码类型,让程序能够读取非英文的html页面。html
文档编码是告诉程序读取文档的规则。文档编码的规则一般能够根据文件的扩展名进行判断。一般的文档格式有纯文本,PDF,PNG,CIF等。python
把文件存储为纯文本格式的形式如今并很少,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())
全球统一的编码格式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'))
在进行网络数据采集,有时候须要采集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 ...
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')
从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)