python抓取网页数据(数据科学越来越火了,网页是数据很大的一个来源)
优采云 发布时间: 2022-01-28 02:28python抓取网页数据(数据科学越来越火了,网页是数据很大的一个来源)
前言:。访问更多。
数据科学越来越流行,网页是一个巨大的数据来源。最近有很多人问如何抓取网页数据。据我所知,常见的编程语言(C++、java、python)都可以实现网页数据抓取,甚至很多统计/计算语言(R、Matlab)都可以实现和网站交互的包。我试过用java、python、R爬取网页,感觉语法不一样,但是逻辑是一样的。我将使用python来谈谈网络抓取的概念。具体内容需要看说明书或者google别人的博客。水平有限,有错误或者有更好的方法,欢迎讨论。.
. 链鞃断头镊子?1点3英亩
第 1 步:熟悉 Python 的基本语法。. 更多信息
如果您已经熟悉 Python,请跳至第 2 步。瓦拉尔?,
Python是一门相对容易上手的编程语言,如何上手取决于编程基础。
(1)如果你有一定的编程基础,建议看google的python类,链接From 1point 3acres bbs
这是一个为期两天的短期培训课程(当然是两天全天),大约七个视频,每个视频后面都有编程作业,每个作业可以在一个小时内完成。这是我学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
导入 urllib2
# 查询任意文章,如On random graph。谷歌搜索每个查询
# 学者有一个url,这个url形成的规则要自己分析。
查询=“上+随机+图形”
url = "" + 查询 + "&btnG=&as_sdt=1%2C5&as_sdtp="。更多信息
# 设置头文件。爬取一些网页不需要特殊的头文件,但是如果这里没有设置,
# google 会认为机器人不允许访问。另外,访问一些网站和设置cookies会比较复杂。
# 这里暂不提及。关于如何知道如何编写头文件,一些插件可以看到你正在使用的浏览器并与网站进行交互。更多信息
# 头文件(这个工具很多浏览器自带),我用的是firefox的firebug插件。
标头 = {“主机”:“”,
"用户代理": "Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0 ",
"接受": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
“接受编码”:“gzip,放气”,
“连接”:“保持活动”}
# 建立连接请求,然后谷歌服务器返回页面信息给变量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 点 3acres bbs
您需要解析此网页。
解析网页的方法:
(1)正则表达式。正则表达式很有用。熟悉它们可以节省很多时间。有时你不需要写脚本或查询数据库来清理数据。你可以直接在notepad++上使用正则表达式. 如何学习正则表达式推荐看:正则表达式30分钟入门教程,链接:
(2) BeautifulSoup模块。BeautifulSoup是一个非常强大的模块,可以将html文件解析成一个对象,也就是一棵树。我们都知道html文件是树状的,比如body -> table -> tbody - > tr,对于节点tbody,tr的子节点很多,BeautifulSoup可以很方便的获取到具体的节点,对于单个节点也可以获取到它的兄弟节点,网上有很多相关说明,不详述这里。说一下,只是为了演示简单的代码:
(3) 以上两种方法结合使用.. 更多信息
# 导入BeautifulSoup模块和re模块,re是python中正则表达式的模块
导入 BeautifulSoup
重新*敏*感*词*
# 生成一个soup对象,步骤2中提到了doc
汤 = BeautifulSoup.BeautifulSoup(doc)
# 获取论文标题、作者、简短描述、引用计数、版本计数、指向 文章 引用列表的超链接
# 这里也用到了一些正则表达式,不熟悉的应该不知道。至于“类”:在“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) # 去掉 "[]" 标签,比如 "[PDF]"
paper_author = soup.html.body.find("div", {"class" : "gs_a"}).text
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)
如果 citeTimes == "":
引用时间 = "0"
如果 versionNum == "":. 来自:/bbs
版本号 = "0"
引用Paper_href = soup.html.body.find("div", {"class" : "gs_fl"}).a.attrs[0][1]
复制代码
这些是我正在为分析引文网络的项目编写的代码。对了,我从googlescholar那里抓取了论文和引文列表的信息,在我访问了大约1900次的时候就屏蔽了google,导致这个区域的ip一时间无法登录googlescholar。
第 4 步:访问数据
数据终于被抓到了,但现在只存储在内存中,必须保存后才能使用。
(1) 将数据写入 txt 文件的最简单方法是在 Python 中使用以下代码:-google 1point3acres
# 打开文件webdata.txt,生成object文件,这个文件可能不存在,参数a表示添加。
# 还有其他参数,比如“r”只能读不能写,“w”可以写但删除原记录等。
文件 = 打开(“webdata.txt”,“a”)
line = paper_name + "#" + paper_author + "#" + paper_desc + "#" + citeTimes + "\n"
# 目标文件的write方法将字符串行写入文件
文件 = file.write(line)./bbs
# 再次做一个随心所欲关闭文件的好青年
文件.close()
复制代码
这样,从网页中抓取并解析出来的数据就存储在本地了,是不是很简单呢?
(2)当然也可以直接连接数据库而不是写入txt文件。python中的MySQLdb模块可以与MySQL数据库交互,将数据直接倒入数据库,与MySQL数据库的逻辑类似于与网站服务器建立链接的逻辑,如果你之前学过数据库,学习使用MySQLdb模块与数据库交互是很简单的;如果没有,需要使用coursera\stanford openEdX平台,有Introduction to Database进行系统学习,w3school供参考或作为手册使用。
Python能够链接数据库的前提是数据库是开放的。我用的是win7 + MySQL5.5,数据库是本地的。.来自:/bbs
% 可以使用cmd打开数据库。启动命令为:
净启动mysql55
%shutdown 命令是:
净停止mysql55
复制代码
使用 MySQLdb 模块的代码示例:
# 导入 MySQLdb 模块。访问更多。
导入 MySQL 数据库
# 与服务器建立链接,host为服务器ip,我的MySQL数据库建在这台机器上,默认为127.0.0.1,
# 用户、密码、数据库名对应输入。默认端口号为3306,charset为编码方式。
# 默认是utf8(也可能是gbk,取决于安装的版本)。.来自:/bbs
conn = MySQLdb.connect(host="127.0.0.1", user="root", passwd="yourPassword", db="dbname", port=3306,字符集="utf8")
# 创建游标
cur = conn.cursor()
# 通过对象cur的execute()方法执行SQL语句
cur.execute("select * from citeRelation where paperName = "On Random Graph""). 涓€浜?-涓夊堎-鍦砰麴麴鍙戝緷
# fetchall()方法获取查询结果,返回一个列表,可以这样直接查询:list[i][j],
# i代表查询结果中的第i+1条记录,j代表这条记录的j+1个属性(别忘了python是从0开始计数的)
列表 = cur.fetchall()
# 还可以进行删除、删除、插入、更新等操作,如:
sql = "update studentCourseRecord set fail = 1 where studentID = "%s" and termid = "%s" and courseID = "%s"" %(studentID,course[0],course[1])
cur.execute(sql)。1点3英亩
# 与查询不同,在执行完delete、insert、update语句后,必须执行以下命令才能成功更新数据库
mit()
# 和往常一样,使用完记得关闭光标,然后关闭链接
cur.close()
conn.close()
复制代码
这样就实现了Python与数据库的交互。除了 MySQL 数据库,python 的 PyGreSQL 模块可以支持 postgreSQL 数据库,原因类似。另外,如果你的网页收录中文,设置编码格式会很麻烦。服务器、Python、数据库和数据库接口需要使用相同的编码格式,避免出现乱码。如果出现中文乱码问题,请相信,你并不孤单!!去google吧,成千上万的人遇到过这个问题。
关于编码的问题,这里是我看到的一篇博文:
从 1 点 3acres bbs
后记:./bbs
爬取网页数据的方法如上所述。爬取数据只是一小步。如何分析数据是大学的问题。欢迎讨论。
以上如有不明白之处,欢迎交流。
注意:
网站的*敏*感*词*爬取会给网站的服务器带来很大的压力,尽量选择服务器比较轻松的时间(比如清晨)。网站很多,不要用三分之一英亩来测试。
Python 的 time 模块的 sleep() 方法可以暂停程序一段时间。比如time.sleep(1)这里程序运行的时候暂停1秒。及时暂停可以缓解服务器压力,保护自己的硬盘,只是为了睡很久,或者去健身房,结果出来了。
更新:
2014年2月15日,更正了几个错别字;添加了相关课程链接;添加了对udacity CS101的介绍;添加了对 MySQLdb 模块的介绍。. 1点3英亩
2014 年 2 月 16 日,添加了指向解释如何编码的博客文章的链接。