python爬虫

原创 2016年08月28日 22:25:34

再不写点东西就真不会写代码了
最近一直在学习云计算的东西,慢慢的也准备整理一下。
今天试试手,写一个简单的爬虫,之前就写了,但一直没有实现。很简单,正好熟悉一下python

# coding=utf-8
import sys
import os
import urllib
import urllib2
import threading

base_uri = "http://www.csdn.net/"
connect_flag = True
running = False
from time import sleep
import re

LINK_RE = r'(http://[\w,\b,/,\.,-]*)'
IMAGE_RE = r"<img.*src\s?=\s?\"[^\w]*([^>]*?)\""
link_set = set()

#初始化参数
link_set_copy = set()
link_set.add(base_uri)
link_set_copy.add(base_uri)
SUCCESS_COUNT=1
ERROR_COUNT=0
IMAGE_COUNT=0



# 创建一个类去处理爬虫程序
class Crawler(object):
    def __init__(self):
        pass

    def writeLinks(self, link):
        file_obj = open("./links/links.txt","a")
        file_obj.write(link+"\n")
        file_obj.close()

    def getImages(self, contents):
        global IMAGE_COUNT
        imagere = re.compile(IMAGE_RE)
        image_list = imagere.findall(contents)
        n=0
        for image in image_list:
            try:

                if image.index("http") == -1:
                    image = "http://"+image
                #print str(image)
                data = urllib.urlopen(image).read()
                f = file("./images/"+str(IMAGE_COUNT)+".jpg", 'wb')
                f.write(data)
                f.close()
                IMAGE_COUNT+=1
            except Exception, e:
                # print "download image failed: "+image

                #print e
                pass

    def getLink(self,contents):
        '''
        :param contents: 获取出来的网页内容
        :return: 无
        '''
        global link_set, link_set_copy
        linkre = re.compile(LINK_RE)
        link_list = linkre.findall(contents, )
        #print "链接数量: " + str(len(link_list))
        #如果不在已经删除的链接的集合就加进去
        for link in link_list:
            if link not in link_set_copy:
                link_set.add(link)

    def req_contents(self):
        global link_set, link_set_copy,ERROR_COUNT,SUCCESS_COUNT,connect_flag, running

        uri = link_set.pop()
        link_set_copy.add(uri)
        #print uri
        self.writeLinks(uri)

        try :
            request = urllib2.Request(uri)
            response = urllib2.urlopen(request)
            result = response.read().decode('utf8')
            self.getImages(result)
            SUCCESS_COUNT += 1
            if connect_flag:
                connect_flag = False
            if not running:
                running = True
            self.getLink(result)
        except UnicodeDecodeError, e:
            ERROR_COUNT += 1
            # print "decoding error"
        except Exception, e:
            ERROR_COUNT += 1
            # print e
        except urllib2.URLError, e:
            ERROR_COUNT += 1
            # print e



    def start(self):
        global link_set
        #import pdb;pdb.set_trace()
        while len(link_set) > 0:
            self.req_contents()



#也是添加一个不断更新的效果,在第一次请求的时候,如果需要时间比较长久能看得到。
class IsGrabbig(threading.Thread):
    def run(self):
        n = 1
        global connect_flag
        # print "grbbing ",
        while connect_flag:

            if n % 4 == 0:
                sys.stdout.write("\r || grabbing || \r")
            elif n % 4 == 1:
                sys.stdout.write("\r /\\ grabbing /\\ \r")
            elif n % 4 == 2:
                sys.stdout.write("\r -- grabbing -- \r")
            else:
                sys.stdout.write("\r \\/ grabbing \\/ \r")
            sys.stdout.flush()
            sleep(0.5)
            n += 1
        #一直想实现一下linux上的进度条的效果,之前没有试过怎么在一行输出并不断更新。sys.stdout.write("\r")就可以实现,\r的效果是从头开始重新输入,会覆盖之前的输出。
        # \r从头开始,覆盖后面的数据,中间不能有换行的输出
        sys.stdout.write("\r 已获取到数据" + " " * 100 + "\n")
        sys.stdout.flush()
#输出一个不断更新的效果
class LinkCount(threading.Thread):

    def run(self):
        global running,SUCCESS_COUNT,ERROR_COUNT
        while not running:
            sleep(0.1)
            pass
        while running:
            sys.stdout.write("\r 已读取的网页数量: "+str(SUCCESS_COUNT) + "\t失败数量:"+str(ERROR_COUNT) + "\t")
            sys.stdout.flush()
            sleep(1)



def generateReport():
    global link_set_copy, link_set
    print "\n"+"*" * 10 + "Report" + "*" * 10
    print " " * 10 + "over" + " " * 10
    print "总共识别出了"+str(len(link_set_copy)+len(link_set))+"个网页"
    print "已经读取"+str(SUCCESS_COUNT)+"个网页"
    print "读取出错的数量" + str(ERROR_COUNT) + "个网页"
    print "*" * 26


if __name__ == "__main__":
    # raw_input("please input the uri")
    # uri_confirm = raw_input("confirm the uri is : " + base_uri + " (Y/N) \n")                                                             "")
    # if uri_confirm is "N" or uri_confirm is "n":
    # sys.exit(0)
    print "program is starting ... "
    IsGrabbig().start()

    crawler = Crawler()
    try:

        LinkCount().start()
        crawler.start()
        print
    except KeyboardInterrupt,e:

        print
    except UnicodeDecodeError,e:
        print
    finally:
        running = False
        connect_flag = True
        generateReport()

很简单,输出的结果也就是这样

sh-3.2# python main.py
program is starting ... 
 已获取到数据                                                                                                    
 已读取的网页数量: 11   失败数量:5  ^C

**********Report**********
          over          
总共识别出了739个网页
已经读取11个网页
读取出错的数量5个网页
**************************

Python开发简单爬虫之爬虫介绍(一)

本博客来自慕课网—Python开发简单爬虫爬虫主要场景: - 不需要登录的静态网页 - 使用Ajax异步加载的内容 - 需要用户登录才可以访问的网页以下主要介绍 不需要登录的静态网页。一、爬虫简...
  • u011026329
  • u011026329
  • 2016年10月27日 22:37
  • 2583

5分钟,6行代码教你写爬虫!(python)

5分钟,6行代码教你写会爬虫! 适用人士:对数据量需求不大,简单的从网站上爬些数据。 好,不浪费时间了,开始! 先来个例子:输入以下代码(共6行)import requests from lxm...
  • csqazwsxedc
  • csqazwsxedc
  • 2017年03月30日 20:52
  • 5953

python写简单爬虫的五种方法

获取html的方法【一】:使用urllib # -*- coding: UTF-8 -*- import urllib   ' 获取web页面内容并返回' def getWebPag...
  • feibuhui123
  • feibuhui123
  • 2012年11月21日 15:33
  • 852

最全Python爬虫总结

(1)普通的内容爬取 (2)保存爬取的图片/视频和文件和网页 (3)普通模拟登录 (4)处理验证码登录 (5)爬取js网站 (6)全网爬虫 (7)某个网站的站内所有目录爬虫 (8)多线程 (9)爬虫...
  • JavaChaoCo
  • JavaChaoCo
  • 2016年05月13日 20:19
  • 6761

Python写一个简单的爬虫样例(不超过50行代码)

###写在题外的话 爬虫,我还是大三的时候,第一次听说,当时我的学姐给我找的一个勤工俭学的项目,要求是在微博上爬出感兴趣的信息,结果很遗憾,第一次邂逅只是擦肩而过。然后,时间来到4年后的研二,在做信息...
  • wsbxzz1
  • wsbxzz1
  • 2017年06月10日 10:55
  • 4936

爬虫系列1:python简易爬虫分析

讲爬虫的基本原理和简易示例,包括单个网页和多网页爬虫的分析。
  • elecjack
  • elecjack
  • 2016年05月29日 16:58
  • 1600

python小实例一:简单爬虫

本文所谓的爬虫就是通过本地远程访问url,然后将url的读成源代码形式,然后对源代码进行解析,获取自己需要的数据,相当于简单数据挖掘。本文实现的是将一个网页的图片爬出保存到本地的过程,例子很简单,用的...
  • xqn2017
  • xqn2017
  • 2017年03月27日 11:52
  • 2866

Python3网络爬虫(十一):爬虫黑科技之让你的爬虫程序更像人类用户的行为(代理IP池等)

转载请注明作者和出处:http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 ...
  • c406495762
  • c406495762
  • 2017年05月28日 16:07
  • 14684

python爬虫,知识结构/路线图/环境工具准备

准备工作,工具,环境
  • qq_36482772
  • qq_36482772
  • 2017年03月11日 02:35
  • 895

python轻量级爬虫的编写

嗯...今天来分享一下如何使用python编写一个简单的网络爬虫。说到爬虫,这简直就是广大懒惰的程序员和宅男们的福音啊,一次编写,想要啥资源就能爬啥资源,高至各种学习资源,论文资料,低至各种图片小视频...
  • Ivan_zgj
  • Ivan_zgj
  • 2016年03月27日 18:00
  • 2986
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python爬虫
举报原因:
原因补充:

(最多只允许输入30个字)