爬虫程序

下面是一个简单的爬虫程序。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

#!/usr/bin/env python

from sys import
argv

from os import
makedirs, unlink, sep

from os.path import
dirname, exists, isdir, splitext

from string import
replace, find, lower

#from htmllib import HTMLParser

from urllib import
urlretrieve

from urlparse import
urlparse, urljoin

from
formatter import
DumbWriter, AbstractFormatter

from
cStringIO import
StringIO

from
HTMLParser import
HTMLParser<br>‘‘‘下面的三行代码是为了设置默认编码 utf8.如果不这样做,python会默认用ascii编码方式去解析,那么如果遇到unicode的编码就出错了。这里先import sys后 reload sys是因为,sys在默认导入的时候通常会删掉setdefaultencoding这个函数,所以需要用reload加载一下‘‘‘

import
sys

reload(sys)

sys.setdefaultencoding(‘utf8‘)

class
RetrieveURL(HTMLParser):#我们用HTMLParser新生成了一个类

    def
__init__(self):

        HTMLParser.__init__(self)

        self.anchorlist=[]#重写__init__函数的唯一目的就是对该类的对象增加一个anchorlist

    def
handle_starttag(self, tag, attrs):#重写handle_starttag函数,让它在遇到<A>标签的时候把href属性代表的超链接记录在anchorlist中

            if
tag==‘a‘
or tag==‘A‘:

                for
t in
attrs :

                    if
t[0] ==
‘href‘ or t[0]==‘HREF‘:

                        self.anchorlist.append(t[1])

class
Retriever(object):# download Web pages

    def
__init__(self, url):

        self.url =
url

        self.file
= self.filename(url)

    

    def
filename(self, url, deffile=‘index.htm‘):

        parsedurl =
urlparse(url, ‘http:‘, 0) ## parse path

        path =
parsedurl[1] +
parsedurl[2]

        ext =
splitext(path)

        if
ext[1] ==
‘‘:    # no file, use default. ( what kind of situation this could be? https://www.baidu.com/file1)

            if
path[-1] ==
‘/‘:

                path +=
deffile

            else:

                path +=
‘/‘ + deffile

        ldir =
dirname(path)    # local directory

        if
sep !=
‘/‘# os-indep. path separator

            ldir =
replace(ldir, ‘/‘, sep)

        if
not isdir(ldir): # create archive dir if nec.

            if
exists(ldir): unlink(ldir)

            print
‘ldir is ‘,ldir

            makedirs(ldir)

        return
path

        

    

    def
download(self): # download Web page

        try:

            retval =
urlretrieve(self.url, self.file)

        except
IOError:

            retval =
(‘*** ERROR: invalid URL "%s"‘
%self.url,)

            return
retval

        return
retval

    ‘‘‘def parseAndGetLinks(self):# parse HTML, save links

        self.parser = HTMLParser(AbstractFormatter(DumbWriter(StringIO())))

        self.parser.feed(open(self.file).read())

        self.parser.close()

        return self.parser.anchorlist‘‘‘

    def
parseAndGetLinks(self):

        self.parser=RetrieveURL()

        self.parser.feed(open(self.file).read())

        self.parser.close()

        return
self.parser.anchorlist

class
Crawler(object):# manage entire crawling process

    count =
0   # static downloaded page counter

    def
__init__(self, url):

        self.q =
[url]

        self.seen =
[]

        self.dom =
urlparse(url)[1]

    def
getPage(self, url):

        r =
Retriever(url)

        retval =
r.download()

        

        if
retval[0] ==
‘*‘: # error situation, do not parse

            print
retval, ‘... skipping parse‘

            return

        Crawler.count +=
1

        print
‘\n(‘, Crawler.count, ‘)‘

        print
‘URL:‘, url

        print
‘FILE:‘, retval[0]

        self.seen.append(url)

        

        links =
r.parseAndGetLinks() # get and process links

        for
eachLink in
links:

            if
eachLink[:4] !=
‘http‘ and find(eachLink, ‘://‘) ==
-1:

                eachLink =
urljoin(url, eachLink)

                print
‘* ‘, eachLink,

            if
find(lower(eachLink), ‘mailto:‘) !=
-1:

                print
‘... discarded, mailto link‘

                continue

            if
eachLink not
in self.seen:

                if
find(eachLink, self.dom) ==
-1:

                    print
‘... discarded, not in domain‘

                else:

                    if
eachLink not
in self.q:

                        self.q.append(eachLink)

                        print
‘... new, added to Q‘

                    else:

                        print
‘... discarded, already in Q‘

            else:

                print
‘... discarded, already processed‘

                        

    def
go(self):# process links in queue

        while
self.q:

            url =
self.q.pop()

            self.getPage(url)

def
main():

    if
len(argv) > 1:

        url =
argv[1]

    else:

        try:

            url =
raw_input(‘Enter starting URL: ‘)

        except
(KeyboardInterrupt, EOFError):

            url =
‘‘

    

    if
not url: return

    robot =
Crawler(url)

    robot.go()

if
__name__ ==
‘__main__‘:

    main()

  

时间: 2024-11-10 16:11:38

爬虫程序的相关文章

用Java写的爬虫程序

这是一个web查找的根本程序,从命令行输入查找条件(开端的URL.处置url的最大数.要查找的字符串), 它就会逐一对Internet上的URL进行实时查找,查找并输出匹配查找条件的页面. 这个程序的原型来自<java编程艺术>, 为了非常好的剖析,站长去掉了其间的GUI有些,并稍作修改以适用jdk1.5.以这个程序为基础,可以写出在互联网上查找 比如图像.邮件.页面下载之类的"爬虫". 先请看程序运转的进程: D:\java>javac  SearchCrawler

使用PHP创建基本的爬虫程序【转】

Web Crawler, 也时也称scrapers,即网络爬虫,用于自动搜索internet并从中提取 想要的内容.互联网的发展离不开它们.爬虫是搜索引擎的核心,通过智能算法发现符合 你输入的关键字的网页. Google网络爬虫会进入你的域名,然后扫描你网站的所有网页,从中析取网页标题,描述, 关键字和链接 - 然后把这些的评价返回给Google HQ,把内容存放至海量的数据库中. 今天,我很高兴告诉你怎么做自己的爬虫 -- 它并不对整个互联网进行搜索,只是对指定的 一个网址获取所有链接和信息[

医学教育网爬虫程序(直播)

12-18 今晚接到老姐的电话,说她已在"医学教育网"订购了不少视频,要我帮她将所有的视频都下载下来.我看了一下,里面有24门科目,每门科目有40多节.要我手动一个一个下,还不如让我去死.这种重复的事情还是让程序来做吧!这里开一篇博客直播编写的过程. 被爬网址:http://www.med66.com/ 前几天我刚做完一个Qihuiwang的爬虫软件.这次我评估了一下,这次要做的视频下载爬虫程序比上次又有新的挑战: (1)要处理登陆的过程,上一个不需要登陆就可以直接爬.这次必须要登陆才

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&

webmagic爬虫程序

package com.letv.cloud.spider;import java.util.HashSet;import java.util.List;import us.codecraft.webmagic.Page;import us.codecraft.webmagic.Site;import us.codecraft.webmagic.Spider;import us.codecraft.webmagic.processor.PageProcessor;public class Mov

python网络爬虫 - 如何伪装逃过反爬虫程序

有的时候,我们本来写得好好的爬虫代码,之前还运行得Ok, 一下子突然报错了. 报错信息如下: Http 800 Internal internet error 这是因为你的对象网站设置了反爬虫程序,如果用现有的爬虫代码,会被拒绝. 之前正常的爬虫代码如下: from urllib.request import urlopen ... html = urlopen(scrapeUrl) bsObj = BeautifulSoup(html.read(), "html.parser") 这

基于Python的urllib2模块的多线程网络爬虫程序

1 m Queue import Queue 2 from gzip import GzipFile 3 from StringIO import StringIO 4 import time 5 import socket 6 class ContentEncodingProcessor(urllib2.BaseHandler): 7 """A handler to add gzip capabilities to urllib2 requests ""

分享常见网站的爬虫程序下载地址[微信|微博|企信|知乎|优酷|京东]

给大家分享一些常见网站的爬虫程序获取地址,站长.数据分析师.爬虫工程师们有福利了!!!大家都懂的,好东西不轻易说出去~ 1.微信公众号文章采集:http://www.shenjianshou.cn/index.php?r=market/configDetail&pid=157 2.新浪微博采集:http://www.shenjianshou.cn/index.php?r=market/configDetail&pid=139 3.企信工商信息采集爬虫:http://www.shenjian

编写爬虫程序的神器 - Groovy + Jsoup + Sublime

写过很多个爬虫小程序了,之前几次主要用C# + Html Agility Pack来完成工作.由于.NET BCL只提供了"底层"的HttpWebRequest和"中层"的WebClient,故对HTTP操作还是需要编写很多代码的.加上编写C#需要使用Visual Studio这个很"重"的工具,开发效率长期以来处于一种低下的状态.   最近项目里面接触到了一种神奇的语言Groovy -- 一种全面兼容Java语言且提供了大量额外语法功能的动态语

新浪新闻爬虫程序

package com.lxf.crawler; import java.io.File; import java.io.FileWriter; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.Tag; import org.htmlparser.filters.AndFilter; import org.htmlparser.filters.HasAttributeFil