项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步
最近很多工作需要用到爬虫去爬取各种数据。本人也不是专业爬虫攻城狮,之前也没做过爬虫的相关工作。现在实际中遇到了要用,那就只好硬着头皮上吧。趁着周末稍微有点时间,网上找了找爬虫相关的资料与项目,然后参考其中某一个比较简单一些的,先上手实际搞一个练练手再说。
爬虫的基本想法就是以一个初始的url为起点,从这个url出发获得更多的url,并从这些网页中获取想要的数据。像google或者baidu这种级别的公司,爬虫是有非常复杂的算法与非常庞大的工程基础去实现的。我们现在是入门阶段,暂且先不考虑那么复杂的逻辑,先从最简单的获取几个页面的数据开始。
废话不多说,直接上可以运行的源码。此部分代码参考了github上得开源项目,并在原来的基础上做了优化与调整。
#coding:utf-8 import re import urllib2 """ 1.获取排名前100的电影 2.每页电影的数量是25个 3.获得的html页面中,跟电影名相关的有是这行: <span class="title">肖申克的救赎</span> 如下这行跟上一行的结构类似,所以正则匹配的时候需要将此行去掉: <span class="title"> / The Shawshank Redemption</span> """ class SpiderDouBan(object): def __init__(self): self.page = 0 self.base_url = "http://movie.douban.com/top250?start={page}&filter=&type=" self.result = [] self._index = 1 def get_page_html(self): url = self.base_url try: my_page = urllib2.urlopen(url.format(page = self.page * 25)).read().decode("utf-8") except urllib2.URLError, ex: if hasattr(ex, "code"): print "The server couldn't fulfill the request." print "Error code: %s" % ex.code elif hasattr(ex, "reason"): print "We failed to reach a server. Please check your url and read the Reason" print "Reason: %s" % ex.reason return my_page def get_index_and_name(self,my_page): tmp_result = [] items = re.findall(r'<span.*?class="title">(.*?)</span>', my_page, re.S) for item in items: if item.find(" ") == -1 : tmp_result.append("top" + str(self._index) + " " + item) self._index += 1 self.result.extend(tmp_result) def start_spider(self): while self.page <= 3: my_page = self.get_page_html() self.get_index_and_name(my_page) self.page += 1 def main(): spider = SpiderDouBan() spider.start_spider() for item in spider.result: print item if __name__ == '__main__': main()相关的注意事项其实在源码中已经有所注释。再啰嗦几句 1.注意豆瓣的页面是25部电影一页。翻页的时候只有start对应的参数发生变化。 2.在对得到的html代码进行正则匹配的时候,注意有一行的结构与包含电影名一行的结构是一样的,需要进行相应的处理去除。