用Python打造属于自己的搜索引擎

写在前面

昨天接了一个IT行业培训广告,有极小部分读者取关了,虽然体量很小,但我还是有点痛心! 经常熬夜更新公众号,累积收到的打赏连一杯咖啡都买不了。现在发个广告赚个小小的咖啡钱就不乐意了。我也不强求打赏,但我发个小小的培训广告对读者是没有任何影响的,却被取关了。如果想永远得到服务,肯定需要给予赞助吧!不然怎么得到持续的服务。读者不赞助,为什么也不让从别人那里获得赞助呢? 我接广告也有自己的原则,我只接IT培训类的广告,并且口碑要好,我需要对每一个读者负责,不会乱接广告的! 最后要说一下:能接到广告的公众号,一般都是有质量的公众号,要想公众号持续输出有质量的文章,肯定需要有一些赞助,这是相辅相成的,大家都是成年人,这个道理都懂!

进入主题

这里我是用Flask框架来做的一个简单的搜索引擎,只用于学习,勿做它用!

且看效果:

视频内容

主要就是熟悉一下Flask的基本使用,再复习一下爬虫的东西

打开Pycharm,然后New Project 选择Flask模块,然后会自动安装Flask库的,这里就不赘述了

先介绍一下Flask, Flask是Python中的一个轻量web框架,能满足我们一般开发需求

运行Flask

#这里可以帮助你声明路由
app = Flask(__name__)


#这里是调用入口
if __name__ == '__main__':
    app.run()

应用启动

#coding:utf-8

from flask import request
from flask import Flask,  render_template
from spiderData import search_info

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

# 这里声明Flask的路由
app = Flask(__name__)

@app.route('/')
def index():
    # 打印出Hello world
    return 'Hello world'
    # 这里可以跳转到模块页,注意这里需要把html页面放在模板文件夹中
    #return render_template('/search.html')
    # 这里跳转可以把需要传入的数据传入到指定网页中,并用{{name}}来获取数据
   # return render_template('/result.html',name = 'zhangsan',)

@app.route('/search')
def search():
    # 使用Flask的request来获取get请求传来的参数
    keyword = request.args.get('wd')
    print keyword
    result = search_info(keyword)
    # 这里跳转可以把需要传入的数据传入到指定网页中,并用{{name}}来获取数据
    return render_template('/result.html',data = result,num = len(result))

# 这里可以传入数据<name>
@app.route('/user/<name>')
def user(name):
    return '<h1>hello,%s!' % name

if __name__ == '__main__':
    app.run()

获取数据

爬取百度搜索的内容页,这里我只获取到第一页数据,由于下一页数据并没有规律,只能通过Selenium来点击下一页获取,为不影响使用体验,这里我暂时没有做下一页数据.有兴趣的朋友可以自己做一下.

# coding:utf-8
import requests
import re
import json
import urllib
from lxml import etree
from flask import render_template


def search_info(keyword):
    results_list = []
    # 这里可以研究得出关键是后面变化的关键词
    url = 'https://www.baidu.com/s?word={}'.format(keyword)
    print '----------------{}'.format(url)
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4620.400 QQBrowser/9.7.13014.400'
    }

    response = requests.get(url,headers = headers)
    response.encoding = 'utf-8'
    #打印出得到的结果
   # print response.text
    source = etree.HTML(response.text)
    results =  source.xpath('//*[@id]/@data-tools')
    for r in results:
        try:
            # 这里需要对 xpath取取的结果进行转码:<type 'lxml.etree._ElementUnicodeResult'> 转成str
            # 然后再把字符串转换成json,再取值
            str = json.loads(r.encode('utf-8'))
            results_list.append(str)
            print str['title'],str['url']
        except Exception as e:
            continue
    return results_list

开始请求

search.html页面(排版工具对html代码不支持故这里不放) 这里需要注意一下action,我这里/search 指定到路由中search方法,然后并调用里面的方法,method是get

显示搜索结果

见result.html (排版工具对html代码不支持故这里不放)

代码Github地址:https://github.com/pythonchannel/a_flask

Flask简单使用参考一下这个文章: http://www.jb51.net/article/65197.htm

原文发布于微信公众号 - Python绿色通道(Future_coder)

原文发表时间:2018-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏花叔的专栏

Nodes小程序的几个新功能-实时编辑、赞赏、自定义头图

最近深圳台风打上瘾了,一到周末就开始刮风下雨,宅在家撸码最合适不过了,于是给Nodes加了几个功能,顺便练练手。 赞赏 有同学说之前想打赏Nodes都不行,现在...

4309
来自专栏技术博文

DiscuzX2.5数据库字典

pre_common_admincp_cmenu – 后台菜单收藏表 title => ‘菜单名称’ url => ‘菜单地址’ sort => ’0′ COM...

3437
来自专栏java一日一条

从输入 URL 到浏览器接收的过程中发生了什么事情?

首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱进,这里将介绍触摸屏设备的交互。

1313
来自专栏Java后端技术

几款效率神器助你走上人生巅峰之园友推荐

  在上篇文章中,我给大家推荐了我工作和生活中最常用的效率软件,引起了猿友的热烈反响,那么这篇文章,我们就来扒一扒猿友留言推荐的效率软件,望诸君笑纳~

1832
来自专栏gaoqin31

Linux例行性工作排程 (crontab)

crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任...

973
来自专栏FSociety

Python爬取猫眼「碟中谍」全部评论

昨天晚上看完碟中谍后,有点小激动,然后就有了这片文章。 我们将猫眼上碟中谍的全部评论保存下来,用于后期分析~ 总共评论3W条左右。

2883
来自专栏编程

高级运维工程师学习路线

信息安全公益宣传,信息安全知识启蒙。 ? 运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎...

4917
来自专栏*坤的Blog

Opera福利谷歌

2843
来自专栏美团技术团队

美团点评前端无痕埋点实践

构建一个数据平台,大体上包括数据采集、数据上报、数据存储、数据计算以及数据可视化展示等几个重要的环节。其中,数据采集与上报是整个流程中重要的一环,只有确保前端数...

1K6
来自专栏编程软文

程序员常用软件,你用了哪些

2895

扫码关注云+社区

领取腾讯云代金券