Python爬虫建站入门手记(2):编写爬虫
admin
2023-07-31 00:40:41
0

上回,我装了环境

也就是一对乱七八糟的东西
装了pip,用pip装了virtualenv,建立了一个virtualenv,在这个virtualenv里面,装了Django,创建了一个Django项目,在这个Django项目里面创建了一个叫做web的阿皮皮。

接上回~

第二部分,编写爬虫。

工欲善其事,必先利其器。

1 aptget install vim # 接上回,我们在screen里面是root身份哦~

当然了,现在我要想一个采集的目标,为了方便,我就选择segmentfault吧,这网站写博客不错,就是在海外上传图片有点慢。

这个爬虫,就像我访问一样,要分步骤来。 我先看到segmentfault首页,然后发现里面有很多tags,每个tags下面,才是一个一个的问题的内容。

所以,爬虫也要分为这几个步骤来写。 但是我要反着写,先写内容爬虫,再写分类爬虫, 因为我想。

2.1 编写内容爬虫

首先,给爬虫建立个目录,在项目里面和app同级,然后把这个目录变成一个python的package

12 mkdir ~/python_spider/sfspidertouch ~/python_spider/sfspider/__init__.py

以后,这个目录就叫爬虫包了

在爬虫包里面建立一个spider.py用来装我的爬虫们

1 vim ~/python_spider/sfspider/spider.py

一个基本的爬虫,只需要下面几行代码:

(代码下面会提供)
然后呢,就可以玩玩我们的“爬虫”了。
进入python shell

123456 >>> from sfspider import spider>>> s = spider.SegmentfaultQuestionSpider(\’1010000002542775\’)>>> s.url>>> \’http://segmentfault.com/q/1010000002542775\’>>> print s.dom(\’h1#questionTitle\’).text()>>> 微信JSSDK嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题

看吧,我现在已经可以通过爬虫获取segmentfault的提问标题了。下一步,为了简化代码,我把标题,回答等等的属性都写为这个蜘蛛的属性。代码如下

12345678910111213141516171819202122232425262728293031323334 # -*- coding: utf-8 -*-import requests # requests作为我们的html客户端from pyquery import PyQuery as Pq # pyquery来操作dom  class SegmentfaultQuestionSpider(object):     def __init__(self, segmentfault_id): # 参数为在segmentfault上的id        self.url = \’http://segmentfault.com/q/{0}\’.format(segmentfault_id)        self._dom = None # 弄个这个来缓存获取到的html内容,一个蜘蛛应该之访问一次     @property    def dom(self): # 获取html内容        if not self._dom:            document = requests.get(self.url)            document.encoding = \’utf-8\’            self._dom = Pq(document.text)        return self._dom     @property     def title(self): # 让方法可以通过s.title的方式访问 可以少打对括号        return self.dom(\’h1#questionTitle\’).text() # 关于选择器可以参考css selector或者jquery selector, 它们在pyquery下几乎都可以使用     @property    def content(self):        return self.dom(\’.question.fmt\’).html() # 直接获取html 胆子就是大 以后再来过滤     @property    def answers(self):        return list(answer.html() for answer in self.dom(\’.answer.fmt\’).items()) # 记住,Pq实例的items方法是很有用的     @property    def tags(self):        return self.dom(\’ul.taglist–inline > li\’).text().split() # 获取tags,这里直接用text方法,再切分就行了。一般只要是文字内容,而且文字内容自己没有空格,逗号等,都可以这样弄,省事。

然后,再把玩一下升级后的蜘蛛。

1234567891011 >>> from sfspider import spider>>> s = spider.SegmentfaultQuestionSpider(\’1010000002542775\’)>>> print s.title>>> 微信JSSDK嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题>>> print s.content>>> # [故意省略] #>>> for answer in s.answers        print answer>>> # [故意省略] #>>> print \’/\’.join(s.tags)>>> 微信jssdk/python/微信开发/javascript

OK,现在我的蜘蛛玩起来更方便了。

2.2 编写分类爬虫

下面,我要写一个抓取标签页面的问题的爬虫。
代码如下, 注意下面的代码是添加在已有代码下面的, 和之前的最后一行之间 要有两个空行

12345678910111213141516171819202122232425262728293031 class SegmentfaultTagSpider(object):     def __init__(self, tag_name, page=1):        self.url = \’http://segmentfault.com/t/%s?type=newest&page=%s\’ % (tag_name, page)        self.tag_name = tag_name        self.page = page        self._dom = None     @property    def dom(self):        if not self._dom:            document = requests.get(self.url)            document.encoding = \’utf-8\’            self._dom = Pq(document.text)            self._dom.make_links_absolute(base_url=\”http://segmentfault.com/\”) # 相对链接变成绝对链接 爽         return self._dom      @property    def questions(self):        return [question.attr(\’href\’) for question in self.dom(\’h2.title > a\’).items()]     @property    def has_next_page(self): # 看看还有没有下一页,这个有必要        return bool(self.dom(\’ul.pagination > li.next\’)) # 看看有木有下一页     def next_page(self): # 把这个蜘蛛杀了, 产生一个新的蜘蛛 抓取下一页。 由于这个本来就是个动词,所以就不加@property了        if self.has_next_page:            self.__init__(tag_name=self.tag_name ,page=self.page+1)        else:            return None

现在可以两个蜘蛛一起把玩了,就不贴出详细把玩过程了。。。

12345 >>> from sfspider import spider>>> s = spider.SegmentfaultTagSpider(\’微信\’)>>> question1 = s.questions[0]>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split(\’/\’)[1])>>> # [故意省略] #

想做小偷站的,看到这里基本上就能搞出来了。 套个模板 加一个简单的脚本来接受和返回请求就行了。

未完待续。
下一篇,采集入库!


相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...