python 爬虫(SGMLParser)

本贴最后更新于 3151 天前,其中的信息可能已经时过境迁

`# -- coding: utf-8 --
import requests
import urllib2
import sys
from sgmllib import SGMLParser
from cgitb import text
reload(sys)
sys.setdefaultencoding('utf8')

class CLAS_EXPERT_LIST(SGMLParser):
def init(self):
reload(sys)
SGMLParser.init(self)
self.is_a = ""
self.name = []
self.urls = []

def start_a(self, attrs): for k, v in attrs : if k=='href' and v.count('detail') > 0 : self.is_a = 1 self.urls.append(v) def end_a(self): self.is_a = 0 def handle_data(self, text): if self.is_a == 1: self.name.append(text)

class EXPERT(SGMLParser):

def __init__(self): SGMLParser.__init__(self) self.is_div = 0 self.is_h3 = 0 self.is_div_p = 0 self.p_cnt = 0 self.image = {} self.is_div_expert = 0 self.is_div_expert_p = 0 self.is_div_expert_p_cnt = 0 def start_div(self, attrs): for k, v in attrs : if k=='class' and v.count('name') > 0 : self.is_div = 1 if k=='class' and v.count('expert_content') > 0 : self.is_div_expert = 1 def end_div(self): if self.is_div == 1 : self.is_div = 0 elif self.is_div_expert == 1 : self.is_div_expert = 0 def start_h3(self, attrs): if self.is_div : self.is_h3 = 1 def end_h3(self): self.is_h3 = 0 def start_p(self, attrs): if self.is_div == 1 : self.is_div_p = 1 elif self.is_div_expert == 1 : self.is_div_expert_p = 1 self.is_div_expert_p_cnt = self.is_div_expert_p_cnt + 1 def end_p(self): if self.is_div : self.is_div_p = 0 self.p_cnt = self.p_cnt + 1 elif self.is_div_expert == 1 : self.is_div_expert_p = 0 def handle_data(self, text): try: if self.is_div == 1: if self.is_h3 == 1 : self.image["name"] = text if self.is_div_p == 1 : if self.p_cnt == 0 : self.image["job"] = text else: self.image["title"] = text if self.is_div_expert == 1: if self.is_div_expert_p == 1 : #print self.is_div_expert_p_cnt,text if self.is_div_expert_p_cnt == 2: self.image["employer"] = text elif self.is_div_expert_p_cnt == 6: self.image["filed"] = text elif self.is_div_expert_p_cnt == 16: self.image["conn_info"] = text #print text #print self.image["name"] , self.image["title"] , self.image["job"] , self.image["employer"] , self.image["filed"] , self.image["conn_info"] except Exception,e: print e

def list_expert():
headers = {
"Connection": "keep-alive",
"Cookie":"Ecp_IpLoginFail=160726111.205.187.18; kc_cnki_net_uid=ff38e944-e46c-2d76-349c-24a97e03ded8; ASP.NET_SessionId=ysbae4exnu0vkugigsdnknps; AutoIpLogin=; LID=; SID=122103; CNZZDATA4922505=cnzz_eid%3D1343153553-1469773415-%26ntime%3D1469782211; FileNameM=cnki%3A; c_m_LinID=LinID=WEEvREcwSlJHSldTTGJhYlRtMVNwOTZ6Q1UzaHdWOFN2RzR2MEEyUkJPWmE=$9A4hF_YAuvQ5obgVAqNKPCYcEjKensW4IQMovwHtwkF4VYPoHbKxJw!!&ot=07/29/2016 18:16:04",
"Host":"elib.cnki.net",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Referer":"http://www.example.com/",
"User-Agent":" Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0"
}
r = requests.get('http://www.chinathinktanks.org.cn/content/expert' )
content=r.text
listname = CLAS_EXPERT_LIST()
listname.feed(content)
rn = zip(listname.urls,listname.name)
return rn

def get_expert(url,name):
headers = {
"Connection": "keep-alive",
"Cookie":"Ecp_IpLoginFail=160726111.205.187.18; kc_cnki_net_uid=ff38e944-e46c-2d76-349c-24a97e03ded8; ASP.NET_SessionId=ysbae4exnu0vkugigsdnknps; AutoIpLogin=; LID=; SID=122103; CNZZDATA4922505=cnzz_eid%3D1343153553-1469773415-%26ntime%3D1469782211; FileNameM=cnki%3A; c_m_LinID=LinID=WEEvREcwSlJHSldTTGJhYlRtMVNwOTZ6Q1UzaHdWOFN2RzR2MEEyUkJPWmE=$9A4hF_YAuvQ5obgVAqNKPCYcEjKensW4IQMovwHtwkF4VYPoHbKxJw!!&ot=07/29/2016 18:16:04",
"Host":"elib.cnki.net",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"utf-8,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Referer":"http://www.example.com/",
"User-Agent":" Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0"
}
r = requests.get(url)
content=r.text
expert = EXPERT()
expert.feed(content)
return expert.image

if name == "main":
try:
i = 0
import chardet
with open("/tmp/expert.txt","w") as f:
exports = list_expert()
for k,v in exports:
v = get_expert(k,v)
name,job,title,employer,filed,conn_info=None,None,None,None,None,None
if "name" in v:
name= v["name"]
if "job" in v:
job= v["job"]
if "title" in v:
title= v["title"]
if "employer" in v:
employer= v["employer"]
if "filed" in v:
filed= v["filed"]
if "conn_info" in v:
conn_info= v["conn_info"]

print "{0}#{1}#{2}#{3}#{4}#{5}".format(name,job,title,employer,filed,conn_info) f.write("{0}#{1}#{2}#{3}#{4}#{5}\n".format(name,job,title,employer,filed,conn_info)) f.flush() i = i + 1 left = divmod(i,50) if left[1] == 0 : print i except Exception,e : print e `
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 5 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 524 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    950 引用 • 943 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖 • 1 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 632 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 293 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9310 引用 • 42373 回帖 • 115 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 252 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 354 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 171 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 10 关注
  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1794 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 2 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 75 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 737 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 698 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 548 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 138 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 28 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 402 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 321 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 3 关注
  • Follow
    4 引用 • 12 回帖 • 8 关注