python 网络数据采集(6-9章)

时间:2022-12-14 07:30:58

上篇博客我们学到第五章,现在我们继续学习。


第六章 读取文档

1.读取txt,这个非常简单

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

如果文件在本地,直接使用open()和read()函数即可读出所有内容,write()写入数据,readline()也是常用的函数

2.读取csv文件,这个我好像没怎么遇到过,就先不看了,以后遇到了再说吧。

3.读取pdf文档。这个需要安装一个额外的包pdfminer(地址为:https://pypi.python.org/pypi/pdfminer3k),下载解压后进入解压目录,python3 setup.py install 安装。不过这样读取的数据只能是字符串,图像不能显示,表格无法显示格式。

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
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")
#pdfFile = open("chapter1.pdf", 'rb')#如果pdf文件在本地,则使用本语句
outputString = readPDF(pdfFile)
print(outputString)
pdfFile.close()

本文再提供一种方法,我认为这种方法简单易懂。上一种方法使用的是pdfminer的包,这个使用的是PyPDF2,代码如下

import PyPDF2
pdfFileObj = open('1.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
print pdfReader.numPages#获取页数
pageObj = pdfReader.getPage(0)#第一页
print pageObj.extractText()
这个方法解释起来就相当简单,参照txt的读入方式请读者自行理解。

4.在windows下用python读取word文档比较简单,下载相应的包,教程非常多,读者自行google,在linux下

import docx
def getText(filename):
doc = docx.Document(filename)#创建doc对象
fullText = []
print len(doc.paragraphs)#获得doc对象中的段落数目
print doc.paragraphs[0].text:获得第一段的文字内容
print doc,paragraphs[0].runs[0]#获得第一段中的第一种字体的内容,例如段落中有圆体和斜体,则输出圆体的内容
for para in doc.paragraphs: #获得doc中的所有内容
fullText.append(para.text)
return '\n'.join(fullText)

getText("1.doc")

5.在linux下读取excel表格,读写需要xlwt和xlrd两个包,请读者自行下载安装

# -*- coding: utf-8 -*- 
import xlwt
import xlrd
import os,sys,string

rootdir = '/home/name1'
rootdir_2 = '/home/name2'

for filename in os.listdir(rootdir):
filepath = rootdir+'/'+filename
data = xlrd.open_workbook(filepath)
book=xlwt.Workbook()#生成一个对象
sheet = book.add_sheet('sheet1',cell_overwrite_ok=True)#添加sheet
sheet.col(0).width=1000#设置第一列的表格宽度
sheet.write(0,0,'Name')#第一行第一列写入Name
table= data.sheets()[0]#第一张表
nrows= table.nrows#获得行数
for i in range(nrows):
try:
old_name = (table.row(i)[1].value)#获取每行单元的内容
new_name = old_name.replace(',',' ')#正则表达式除杂,此处可以写更多
sheet.write(i,0,new_name)#写入
except Exception, e:
print e
book.save(rootdir_2+'/'+filename[:-1])#保存


第七章 清理脏数据

       脏数据包含很多中,比如停用词,符号等等,可以用正则表达式来去除,当然反过来我们也能使用正则表达式来提取我们所需要的信息。正则表达式的简单用法可以参考其他博客,我的博客中也有。本书中介绍了一种可视化的软件——OpenRefine,不过在我目前的认知当中,我更喜欢直接使用正则表达式来处理。该软件的具体使用方法就不介绍了。清理脏数据依据不同的需求有不同的方法,大致的过程是:首先处理字符串本身,例如大小写,数字,标点符号等,然后再去除停用词等无意义的单词,最后抽取有用的数据。


第八章 自然语言的读写

本章的前半部分我感觉跟普通的数据处理过程差不多,然后讲了马尔科夫链的状态转换,最后讲述了nltk(自然语言处理包)的使用,对于做自然语言处理的同学们来说,nltk的重要性就无需赘言了,本文也不打算详细的叙述其使用,建议同学们系统的学习一下。下面着重讲解nltk,python2.7下安装如下

python -m nltk.downloader all
在python3.0下安装如下
pip3 install nltk #当然python2.7下也可以用pip2 install nltk 来安装nltk

在使用nltk包的过程中,由于nltk包很大,所以不建议全部导入,当然如果工程大,涉猎广,就必须全部导入了。安装完成以后,就可以进行语言分析啦。例如

from nltk import ngrams                                                                                
from nltk import FreqDist
from nltk.book import *
fourgrams = ngrams(text6, 4)#每四个作为i一个元素
fourgramsDist = FreqDist(fourgrams)
a=fourgramsDist[("father", "smelt", "of", "elderberries")]#这四个单词同时出现的次数
print (fourgramsDist.most_common(10))#最常见的10个元素
print(a)
书中还讲述了利用nltk中的词性分析来处理自然语言(英文),读者可以自行查阅,不过我个人认为一般情况下用不到。


第九章 利用表格和登录日志

在爬取数据的过程中,经常需要提交表单或者登录信息的情况,本章我们将讲述部分此类问题的解决方法,涉及到验证码的情况后续讲解。我们利用书本中提供的一个简单的表单来讲解,网址为http://pythonscraping.com/pages/files/form.html   由此我们可以查看其源代码

<form method="post" action="processing.php">
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname"><br>
<input type="submit" value="Submit">
</form>
如上所示,我们需要提交first name 和last name,它们的属性中name的部分分别为firstname 和lastname,这个属性非常重要。另外,在表头部分的action中是processing.php.这是处理表单内容的网址的绝对地址,也就是说我们向http://pythonscraping.com/files/processing.php这个网址提交数据,所以在写程序的时候应该是这个网址,而填写表单的网址权当一层包装吧。有了上面的讲述,下面给出一个示例
import requests
params = {'firstname': 'Ali', 'lastname': 'chen'}#根据需要自行填写名称,<span style="color:#FF0000;">但是firstname 和lastname不能修改,一定要与上述的input标签的name属性的内容相同</span>
r = requests.post("http://pythonscraping.com/files/processing.php", data=params)#处理表格的网址(action后跟的地址)
print(r.text)
下面用一个真实的示例,大家首先申请一个吾志(写随想的网址)的账号
import requestsparams = {'email': 'your_email', 'password': 'your_password'}#填写自己的账号和密码,email和password要和网站上的对应 r = requests.post("https://wuzhi.me/login", data=params) #网址要和action后的网址对应<pre name="code" class="python">r = requests.get("https://wuzhi.me/u/256856", cookies=r.cookies) #利用cookies,获取文章信息
 print(r.text)#这样就获得了自己的吾志内容
 

在表单中经常会遇到复选框,单选框等情况,与上述情况相同,只要名称和值相对应就好了,名称和值可以通过查看源代码或者浏览器自带的调试工具。书中还提到了文件和图像的提交,这个很少遇到,暂时不讲了。在以上示例中,我们用到了cookies,它就是记录登录信息的(可以理解为通行证),利用该信息就可以访问更多内容。但是如果网页多而且复杂,cookies可能是变化的,则我们尽量使用以下形式

import requests
session = requests.Session()
 params = {'email': 'your_email', 'password': 'your_password'}
r = requests.post("https://wuzhi.me/login", data=params)
r = session.get("https://wuzhi.me/u/256856")
print(r.text)#这样就获得了自己的吾志内容
session会自动跟踪各种登录信息,不用我们手动添加。除了这种情况,还有一种更加严格的验证方式,例如http://pythonscraping.com/pages/auth/login.php这样的情况出现时使用以下方法解决
import requestsfrom requests.auth import AuthBasefrom requests.auth import HTTPBasicAuthauth = HTTPBasicAuth('ryan', 'password')#直接给出账号和密码即可r = requests.post(url="http://pythonscraping.com/pages/auth/login.php", auth=auth)#给出auth=auth即可print(r.text)
对于验证码和其他无法访问页面的问题将在11和12章描述