Python采集器网站建设简介-从头开始构建采集网站(两个: 编写采集器)
优采云 发布时间: 2020-08-06 17:19上次,我安装了环境
那是一堆混乱的东西
已安装pip,随pip一起安装了virtualenv,并已建立了virtualenv. 在此virtualenv中,安装了Django,创建了Django项目,并在此Django项目中创建了一个名为web的Apipi.
继续上次〜
第二部分,编写一个采集器.
工人要想做得好,必须首先完善他们的工具.
bashapt-get install vim # 接上回,我们在screen里面是root身份哦~
当然,现在我要有一个采集目标. 为了方便起见,我将选择segmentfault. 这个网站很适合写博客,但是在国外上传图片有点慢.
与我的访问一样,此爬网程序必须分步完成. 我首先看到了segmentfault主页,然后发现其中有很多标签,并且在每个标签下都存在一个一个的问题.
因此,采集器应分为以下几个步骤来编写. 但是我要用另一种方式来编写它,因为我想先写内容采集器,然后编写分类采集器.
2.1编写内容采集器
首先,为爬虫创建一个目录,该目录与项目中的应用程序处于同一级别,然后将该目录转换为python包
bashmkdir ~/python_spider/sfspider
touch ~/python_spider/sfspider/__init__.py
从现在开始,此目录将称为“爬虫程序包”
在采集器软件包中创建spider.py以安装我的采集器
bashvim ~/python_spider/sfspider/spider.py
基本的采集器仅需要以下代码行:
(下面将提供代码)
然后,我们可以玩“爬行动物”了.
输入python shell
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> s.url
>>> 'http://segmentfault.com/q/1010000002542775'
>>> print s.dom('h1#questionTitle').text()
>>> 微信JS—SDK嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题
看,我现在可以通过采集器获取segmentfault的问题标题. 在下一步中,为了简化代码,我将标题,答案等的属性编写为蜘蛛的属性. 代码如下
python# -*- 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方法,再切分就行了。一般只要是文字内容,而且文字内容自己没有空格,逗号等,都可以这样弄,省事。
然后,再次玩升级的蜘蛛.
python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> print s.title
>>> 微信JS—SDK嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题
>>> print s.content
>>> # [故意省略] #
>>> for answer in s.answers
print answer
>>> # [故意省略] #
>>> print '/'.join(s.tags)
>>> 微信js-sdk/python/微信开发/javascript
好的,现在我的蜘蛛玩起来更方便了.
2.2编写分类采集器
接下来,我要编写一个对标签页进行爬网的爬网程序.
代码如下. 请注意,下面的代码被添加到现有代码的下面,并且在最后一行的前一行和上一行之间必须有两个空行
pythonclass 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
现在您可以一起玩两个蜘蛛了,所以我不再详细介绍游戏过程. .
python>>> from sfspider import spider
>>> s = spider.SegmentfaultTagSpider('微信')
>>> question1 = s.questions[0]
>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split('/')[-1])
>>> # [故意省略] #
如果您想成为小偷,基本上可以在这里找到它. 设置模板并添加一个简单的脚本来接受和返回请求.
待续.