爬虫学习(一)---feapder
爬虫框架学习(一)---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()
相关参数说明
- feapder.AirSpider:轻量爬虫基类。
- start_requests:初始任务下发入口。
- feapder.Request:基于requests库类似,表示一个请求,支持requests所有参数,同时也可携带些自定义的参数。
- parser:数据解析函数。
- 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的应用,以及为啥这次差点出事情
参考文档
受害人✧ (≖ ‿ ≖)✧
本文链接:
/archives/1691059796923
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
打工人驿站!
喜欢就支持一下吧
打赏
微信
支付宝