爬虫框架学习(一)---feapder

今天原本想学Vue的,但记起来有数据采集可以干,因为带着实际目的去学一项技术比较好

所以今天来写一下爬虫的教学和例子

有一说一,看着你爬的语料一点点变大,是一种很爽的体验

基础命令

安装前置库(#[all] 完整版,支持根据内存去重)

pip3 install feapder[all]

命令行创建(#-s 命名)

feapder create -s spidertest

编辑具体内容

# -*- coding: utf-8 -*-
# 用的是框架中的AirSpider
class SpiderTest(feapder.AirSpider):
    def start_requests(self):
        yield feapder.Request("https://spidertools.cn")

    def parse(self, request, response):
        # 提取网站title
        print(response.xpath("//title/text()").extract_first())
        # 提取网站描述
        print(response.xpath("//meta[@name='description']/@content").extract_first())
        print("网站地址: ", response.url)


if __name__ == "__main__":
    SpiderTest().start()

相关参数说明

  1. feapder.AirSpider:轻量爬虫基类。
  2. start_requests:初始任务下发入口。
  3. feapder.Request:基于requests库类似,表示一个请求,支持requests所有参数,同时也可携带些自定义的参数。
  4. parser:数据解析函数。
  5. response:请求响应的返回体,支持xpath、re、css等解析方式。

生成器函数

这边解释一下生成器函数是怎么回事,主要是博主也不是很会python,学习一下

生成器函数是一种特殊类型的函数,它使用yield关键字来产生一个序列(可迭代对象),而不是使用return关键字返回一个值。当调用生成器函数时,它不会立即执行函数体,而是返回一个生成器对象,这个对象可以用于按需产生值,节省内存并支持惰性计算。

优点:在处理大量数据或无限序列时非常有用,因为它是按需生成值,可以节省内存资源并提高性能。

一句话总结:饥荒训牛,喂一口才能用,但是够用而且省资源(服从度在之前的状态下增加)♪(^∀^●)

在本爬虫中:

  • start_requests(self)方法:这是一个生成器函数,用于产生初始请求。在这个示例中,生成了一个初始请求。使用yield关键字返回一个feapder.Request对象,框架会自动根据这个请求发起爬取操作
  • parse(self, request, response)方法:这个方法是爬虫的主要解析函数。这里,它会输出页面的标题和描述信息。同时,可以添加yield关键字继续调用feapder.Request向一些URL发送请求(详见下文示例)实现深度爬虫

可添加自定义的数据解析函数

def start_requests(self):
        yield feapder.Request("http://reportapi.eastmoney.com/report",
                              callback=self.parse_report_info)

    def parse_report_info(self, request, response):
        html = response.content.decode("utf-8")
        if len(html):
            content = html.replace('datatable1351846(', '')[:-1]
            content_json = json.loads(content)
            print(content_json)

示例

以上均为之前随意爬的,没有具体目标

下面以拷打某浪新闻网站为例 (•‾̑⌣‾̑•)✧˖°

发送请求

(先拷打父亲)o(〃’▽’〃)o

class NewSpider(feapder.AirSpider):
    def start_requests(self):
        yield feapder.Request("https://news.sina.com.cn")

解析函数1.0

def parse(self, request, response):
    # 提取网站title
    print(response.xpath("//title/text()").extract_first())
    # 提取网站描述
    print(response.xpath("//meta[@name='description']/@content").extract_first())
    #提取所有的a标签
    tags=response.xpath("//a")
    count=1 #我是怕自己爬多了被封IP所以先搞个计数器
    for tag in tags:
        url=tag.xpath("./@href").extract_first()#取出URL
        text=tag.xpath("./text()").extract_first()#取出文本
        count+=1
        if url is not None:#排除空地址
            if(count<500):
                #这一步主要是人工排除一些无效链接,一种是邮件网站,一种是php链接
                if(text and len(text)>8) and not( url.endswith("php")or url.startswith("http://vip.book.sina.com.cn")or url.startswith("mailto:")):
                    #print(url,text)
                    #child_requests(self,url)
                    #调用
                    #然后拷打儿子o(〃’▽’〃)o 
                    yield feapder.Request(url,callback=self.parse_child)
            else:
                break

解析函数2.0

(๑乛◡乛๑)

def parse_child(self,request,response):
    arts=response.xpath("//p")#取出p标签
    if (arts):
        for art in arts :
            origin=art.xpath("./text()").extract()#取出文本
            if(origin):
                result=origin[0].replace('\u3000\u3000','')#稍微处理一下文本(去空格)
                #print(result)
                with open('alloutput.txt', 'a', encoding='utf-8') as file:
                    file.write(result)
    pass

基本能爬一些语料了,但是还是有很多问题,下一章去解决吧

TODO

  • 换Spider,开线程池加速
  • 做一些数据清洗的相关工作
  • 只用了Xpath,可以试着与re正则结合
  • 封装出对应的函数,实现更简便的深度爬虫

我丢,刚才博客差点回不来了,docker工具乱搞是这样的,下一篇Docker讲一下 Swarm和Compose的应用,以及为啥这次差点出事情

参考文档

feapder官方文档

python使用xpath(超详细)

受害人✧ (≖ ‿ ≖)✧

文章作者: P4ul
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 打工人驿站
大数据 python
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝