python抓取网页数据(抓取有些的信息,你需要解析这个网页(1))

优采云 发布时间: 2021-09-30 22:24

  python抓取网页数据(抓取有些的信息,你需要解析这个网页(1))

  设置头文件。爬取一些网页的头文件是不需要专门设置的,但是如果这里不设置,google就会认为是不允许机器人访问的。另外,一些网站被访问并设置了cookies。这个比较复杂,这里暂时不提。关于如何知道头文件怎么写,有的插件可以看到你的浏览器和网站交互的头文件(很多浏览器都内置了这种工具),我用的是firebug插件- 在 Firefox 中。

  header = {'Host':'',

  '用户代理':'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,该变量是一个对象

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

  con = urllib2.urlopen(req)

  调用con对象的read()方法,返回html页面,即带有html标签的纯文本

  doc = con.read()

  关闭连接。就像读取文件后关闭文件一样,如果不关闭它,有时可以,但有时会出现问题。因此,作为一个遵纪守法的好公民,最好是关闭联系。

  关闭()

  复制代码

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

  Step 三、 解析网页

  上面的步骤是得到了网页的信息,但是收录了html标签,你得把这些标签去掉,然后从html文本中整理出有用的信息,

  您需要解析此页面。

  解析网页的方法:

  (1) 正则表达式。正则表达式非常有用,熟悉起来可以节省很多时间。有时候清洗数据不需要写脚本,也不需要对数据库进行查询,只是正则表达式的组合在记事本++上。如何学习正则表达式的建议:关于正则表达式的 30 分钟介绍性教程,链接:

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

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

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

  *敏*感*词*美汤

  *敏*感*词*重新

  生成一个soup对象,doc在第二步有提到

  汤 = 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

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 block,导致这个区的ip暂时无法登录googlescholar。

  第 4 步:访问数据

  最后抓取到数据后,只存储在内存中,必须保存后才能使用。

  (1) 最简单的将数据写入txt文件的方式,Python可以使用如下代码实现:

  打开文件 webdata.txt 并生成目标文件。该文件可能不存在。参数 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)-google 1point3acres

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

file.close()

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

  (2)当然也可以不写txt文件直接连接数据库。python中的MySQLdb模块可以与MySQL数据库交互,直接将数据倒入数据库,建立与MySQL数据库的逻辑类似于与网站服务器建立链接的逻辑,如果之前学过数据库,学习使用MySQLdb模块与数据库交互非常简单;如果没有,必须使用coursera[stanford]()Introduction to Database在openEdX平台上搭建进行系统学习,w3school仅供参考或作为手册使用。

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

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

net start mysql55 [1point3acres.com/bbs](http://1point3acres.com/bbs)

%关闭命令是:

net stop mysql55

  使用 MySQLdb 模块代码的示例:

  # 导入 MySQLdb模块

import MySQLdb

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

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

# 默认的是utf8(也有可能是gbk,看安装的版本)。

conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='yourPassword', db='dbname', port=3306, charset='utf8')

# 建立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、数据库和数据库接口使用相同的编码格式,以避免出现乱码。如果出现中文乱码问题,请相信你不是一个人!!去谷歌吧,成千上万的人都遇到过这种问题。

  关于编码问题,附上我看到的一篇博文

  :

  后记:

  上面介绍了抓取网页数据的方法。数据只是一小步。如何分析数据是大学的问题。欢迎讨论。

  以上有不清楚的地方,欢迎交流。

  **请注意:

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

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

  **

  更新:

  2014年2月15日,修改了几个打字错误;添加了相关课程链接;加入udacity CS101;添加了 MySQLdb 模块的介绍。

  2014 年 2 月 16 日,添加了指向介绍编码方法的博客文章的链接。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线