python抓取网页数据(数据科学越来越火了,如何抓网页数据?(一))

优采云 发布时间: 2022-01-23 10:04

  python抓取网页数据(数据科学越来越火了,如何抓网页数据?(一))

  前言:

  数据科学越来越流行,网页是一个巨大的数据来源。最近有很多人问如何抓取网页数据。据我所知,常见的编程语言(C++、java、python)都可以实现网页数据抓取,甚至很多统计/计算语言(R、Matlab)都可以实现和网站交互的包。我试过用java、python、R爬取网页,感觉语法不一样,但是逻辑是一样的。我将使用python来谈谈网络抓取的概念。具体内容需要看说明书或者google别人的博客。水平有限,有错误或者有更好的方法,欢迎讨论。. 更多信息

  第 1 步:熟悉 Python 的基本语法

  如果您已经熟悉 Python,请跳到第 2 步。

  Python是一门相对容易上手的编程语言,如何上手取决于编程基础。

  (1)如果你有一定的编程基础,建议看google的python类,链接——google 1point3acres

  这是一个为期两天的短期培训课程(当然是两天全天),大约七个视频,每个视频后面都有编程作业,每个作业可以在一个小时内完成。这是我学python的第二门课(第一门是codecademy的python,很久以前看的,很多内容记不清了),每次看视频+编程作业一个多小时天,六天完成。不错,用python写基本程序没有问题。

  (2)如果你没有任何编程基础,我建议你在coursera上阅读莱斯大学的An Introduction to Interactive Programming in Python。我没有上过这门课程,但是coursetalk上的评论非常积极,并且也有现场的同学评论(点这里),课程链接:Udacity上的CS101也是不错的选择,现场有相关的讨论帖(点这里),而这门课叫做build a search engine,里面会专门讲一些网络相关的话题模块,其他的学习资源还有code school和codecademy,这些资源也挺不错的,但是编程量太少了,初学者应该系统的跟着课,多练习,打下扎实的基础基础。

  当然,每个人的喜好不一样,我推荐的不一定适合你。你可以先看看这个帖子【长期红利帖】介绍一下别人在你上过的公开课上都说了些什么,或者看一下课程评论,再决定。

  第二步:学习如何与网站建立链接并获取网页数据。

  要编写与 网站 交互的脚本,您必须熟悉与 python 和网页相关的几个模块(urllib、urllib2、httplib)之一。你只需要知道一个,其他的都差不多。这三个是python提供的与网页交互的基础模块,还有其他的,比如:mechanize和scrapy,我没用过,可能性能更好。欢迎补充更多信息。对于基本的网页抓取,前三个模块就足够了。

  以下代码演示了如何使用 urllib2 与 google Academic 交互获取网页信息。

  # 导入模块 urllib2

import urllib2

# 随便查询一篇文章,比如On random graph。对每一个查询google

# scholar都有一个url,这个url形成的规则是要自己分析的。

query = 'On+random+graph'

url = 'http://scholar.google.com/scholar?hl=en&q=' + query + '&btnG=&as_sdt=1%2C5&as_sdtp='

# 设置头文件。抓取有些的网页不需要专门设置头文件,但是这里如果不设置的话,. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴

# google会认为是机器人不允许访问。另外访问有些网站还有设置Cookie,这个会相对复杂一些,

# 这里暂时不提。关于怎么知道头文件该怎么写,一些插件可以看到你用的浏览器和网站交互的

# 头文件(这种工具很多浏览器是自带的),我用的是firefox的firebug插件。.鏈枃鍘熷垱鑷�1point3acres璁哄潧

header = {'Host': 'scholar.google.com',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Encoding': 'gzip, deflate',

'Connection': 'keep-alive'}

# 建立连接请求,这时google的服务器返回页面信息给con这个变量,con是一个对象

req = urllib2.Request(url, headers = header)

con = urllib2.urlopen( req )

# 对con这个对象调用read()方法,返回的是html页面,也就是有html标签的纯文本

doc = con.read()

# 关闭连接。就像读完文件要关闭文件一样,如果不关闭有时可以、但有时会有问题,

# 所以作为一个守法的好公民,还是关闭连接好了。

con.close()

  上面的代码将google Academic上查询On Random Graph的结果返回给变量doc,和打开google Academic搜索On Random Graph,然后在网页上右键保存是一样的。

  步骤三、解析网页

  以上步骤获取网页的信息,但是收录html标签,需要去掉这些标签,然后从html文本中整理出有用的信息,

  您需要解析此网页。

  解析网页的方法:

  (1)正则表达式。正则表达式很有用。熟悉它们可以节省很多时间。有时你不需要写脚本或查询数据库来清理数据。你可以直接在notepad++上使用正则表达式. 如何学习正则表达式推荐看:正则表达式30分钟入门教程,链接:. 更多信息

  (2) BeautifulSoup 模块。BeautifulSoup 是一个非常强大的模块,可以将 html 文件解析成一个对象,也就是一棵树。我们都知道 html 文件是树状的,比如 body -> table -> tbody - > tr,对于节点tbody,tr的子节点很多,BeautifulSoup可以很方便的获取到具体的节点,对于单个节点也可以获取到它的兄弟节点,网上有很多相关说明,不详述这里。说一下,只是为了演示简单的代码:

  (3) 以上两种方法结合使用。

  # 导入BeautifulSoup模块和re模块,re是python中正则表达式的模块

import BeautifulSoup

import re

# 生成一个soup对象,doc就是步骤二中提到的

soup = BeautifulSoup.BeautifulSoup(doc)

# 抓取论文标题,作者,简短描述,引用次数,版本数,引用它的文章列表的超链接

# 这里还用了一些正则表达式,不熟悉的先无知它好了。至于'class' : 'gs_rt'中

# 'gs_rt'是怎么来的,这个是分析html文件肉眼看出来的。上面提到的firebug插件

# 让这个变的很简单,只要一点网页,就可以知道对应的html 标签的位置和属性,

# 相当好用。

paper_name = soup.html.body.find('h3', {'class' : 'gs_rt'}).text

paper_name = re.sub(r'\[.*\]', '', paper_name) # eliminate '[]' tags like '[PDF]'

paper_author = soup.html.body.find('div', {'class' : 'gs_a'}).text. from: 1point3acres.com/bbs

paper_desc = soup.html.body.find('div', {'class' : 'gs_rs'}).text

temp_str = soup.html.body.find('div', {'class' : 'gs_fl'}).text

temp_re = re.match(r'[A-Za-z\s]+(\d*)[A-Za-z\s]+(\d*)', temp_str)

citeTimes = temp_re.group(1)

versionNum = temp_re.group(2)

if citeTimes == '':

citeTimes = '0'

if versionNum == '':

versionNum = '0'

citedPaper_href = soup.html.body.find('div', {'class' : 'gs_fl'}).a.attrs[0][1]

  这些是我正在为分析引文网络的项目编写的代码。对了,我从googlescholar那里抓取了论文和引文列表的信息,在我访问了大约1900次的时候就屏蔽了google,导致这个区域的ip一时间无法登录googlescholar。

  第 4 步:访问数据

  数据终于被抓到了,但现在只存储在内存中,必须保存后才能使用。

  (1) 将数据写入 txt 文件最简单的方法是在 Python 中使用以下代码:

  # 打开文件webdata.txt,生成对象file,这个文件可以是不存在的,参数a表示往里面添加。

# 还有别的参数,比如'r'只能读但不能写入,'w'可以写入但是会删除原来的记录等等

file = open('webdata.txt','a')

line = paper_name + '#' + paper_author + '#' + paper_desc + '#' + citeTimes + '\n'

# 对象file的write方法将字符串line写入file中

file = file.write(line)

# 再一次的,做个随手关闭文件的好青年

file.close()

  这样,从网页中抓取并解析出来的数据就存储在本地了,是不是很简单呢?

  (2)当然也可以直接连接数据库而不是写入txt文件。python中的mysqldb模块可以与mysql数据库交互,将数据直接倒入数据库中,与MySQL数据库的逻辑类似于与网站服务器建立链接的逻辑,如果你之前学过数据库,学习使用MySQLdb模块与数据库交互是很简单的;有一个系统学习的数据库介绍,w3school作为参考或手册使用。

  Python能够链接数据库的前提是数据库是开放的。我用的是win7 + MySQL5.5,数据库是本地的。

  %可以用cmd开启数据库,启动命令是:

net start mysql55

%关闭命令是:

net stop mysql55

  使用 MySQLdb 模块的代码示例:

  # 导入 MySQLdb模块

import MySQLdb

# 和服务器建立链接,host是服务器ip,我的MySQL数据库搭建在本机,默认的是127.0.0.1,

# 用户、密码、数据库名称对应着照输就行了,默认的端口号是3306,charset是编码方式,

# 默认的是utf8(也有可能是gbk,看安装的版本)。. visit 1point3acres.com for more.

conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='yourPassword', db='dbname', port=3306, charset='utf8'). 鍥磋鎴戜滑@1point 3 acres

# 建立cursor

cur = conn.cursor()# 通过对象cur的execute()方法执行SQL语句

cur.execute("select * from citeRelation where paperName = 'On Random Graph'")

# fetchall()方法获得查询结果,返回的是一个list,可以直接这样查询:list[i][j],

# i表示查询结果中的第i+1条record,j表示这条记录的第j+1个attribute(别忘了python从0开始计数)

list = cur.fetchall()

# 也可以进行delete,drop,insert,update等操作,比如

sql = "update studentCourseRecord set fail = 1 where studentID = '%s' and semesterID = '%s' and courseID = '%s'" %(studentID,course[0],course[1])

cur.execute(sql)

# 与查询不同的是,执行完delete,insert,update这些语句后必须执行下面的命令才能成功更新数据库

conn.commit()

# 一如既往的,用完了之后记得关闭cursor,然后关闭链接

cur.close()

conn.close()

  这样就实现了Python与数据库的交互。除了 MySQL 数据库,python 的 PyGreSQL 模块可以支持 postgreSQL 数据库,原因类似。另外,如果你的网页收录中文,设置编码格式会很麻烦。您需要服务器、Python、数据库和数据库接口使用相同的编码格式,以避免出现乱码。如果出现中文乱码问题,请相信,你并不孤单!!去google吧,成千上万的人遇到过这个问题。

  关于编码的问题,这里是我看到的一篇博文:

  后记:

  爬取网页数据的方法如上所述。爬取数据只是一小步。如何分析数据是大学的问题。欢迎讨论。

  以上如有不明白之处,欢迎交流。

  注意:

  网站的*敏*感*词*爬取会给网站的服务器带来很大的压力,尽量选择服务器比较轻松的时间(比如清晨)。网站很多,不要用三分之一英亩来测试。

  Python 的 time 模块的 sleep() 方法可以暂停程序一段时间。比如time.sleep(1)这里程序运行的时候暂停1秒。及时暂停可以缓解服务器压力,保护自己的硬盘,只是为了睡很久,或者去健身房,结果出来了。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线