flask,MySQL实现简单小搜索引擎

本文介绍了一个使用scrapy爬取数据,然后利用flask构建简单搜索引擎的项目。首先,通过scrapy爬虫抓取jobbole伯乐在线的文章,接着在flask中建立搜索功能,并探讨了如何处理爬取过程中的错误,如emoji存储问题和MySQL数据库的列修改。
摘要由CSDN通过智能技术生成

断断续续学习了些python的网课,涉及python基础,scrapy框架,django框架,flask框架,elasticsearch,mysql,课程都不尽人意,两个课程相互借鉴了一下,有点小收获。


 琢磨着也做点小玩意。

1、scrapy框架爬取网络数据

2、flask搭建简单搜索引擎

3、一些错误处理


scrapy爬取数据

爬过一些网站,目前觉得知乎改版后的爬取有点难。

这里我选择爬取jobbole伯乐在线。

首先看一下scrapy的框架图!(官方标配)

scrapy框架图

通俗来说就是spider发出请求爬取的url送到scheduler(调度程序:所有的url都会汇总到这里进行迭代),调度程序scheduler将要请求的url经过中间件middleware(可以在此处设置IP池,user-agent池等)发送到下载器downloader下载,结果response返回给spider(在这里可以对数据做操作,但不建议,因为看起来很乱),而item和item pipeline则是对数据进行处理的,其中item.py中定义数据类型以及处理数据函数,管道pipeline.py中做保存操作,比如存入数据库。(切记要在setting文件中给自定义的pipeline注册好)

一、scrapy爬取伯乐在线的文章

 # 利用scrapy框架创建爬虫,cmd下

pip install scrapy      # 安装包

 # 然后cd 到想创建的目录下,创建

scrapy startproject your spider project name

 可以用pychame打开该工程文件,在spiders下创建爬虫逻辑,比如我创建的是jobbole.py

# -*- coding: utf-8 -*-
import scrapy
import datetime

from scrapy.http import Request
from urllib import parse

from ArticleSpider.items import jobboleArticleSpiderItem,JoboleMySqlItem    # 自己目录下的文件
import hashlib  # 将哈希package引进

# 继承scrapy.Spider
class JobboleSpider(scrapy.Spider):
    name = 'jobbole'
    # 允许的域名
    allowed_domains = ['blog.jobbole.com']
    #开始页面
    start_urls = ['http://blog.jobbole.com/all-posts/']
    #这里我设置一个数值控制爬取的页面数
    crawlpage=0

    # 必须重载的函数,对数据做处理
    def parse(self, response):
    	# xpath选择器找到自己要选择的元素,据说这样的比beautifulsoup处理速度快
    	# 取页面下文章节点,后对节点处理
        all_post_node = response.xpath("//div[@class = 'post floated-thumb']//div[@class = 'post-thumb']")
        # 取下一页地址
        next_parse_url =  response.xpath('//a[@class = "next page-numbers"]/@href').extract()[0]
        # 遍历节点,获取文章url和照片的url
        for post_node in all_post_node:
            post_url = post_node.xpath('./a/@href').extract_first("")
            post_url = parse.urljoin(response.url, post_url) #添上域名,防止只带部分域名的链接
            image_url = post_node.xpath('.//a/img/@src').extract_first("")
            image_url = parse.urljoin(response.url, image_url)  # 添上域名,防止只带部分域名的链接
            # yield出去,这是一个迭代器
            yield Request(post_url, meta={"front_image_url": image_url}, callback=self.parse_content)	#请求到页面后作为参数,callback到函数prase_content


        # 下一页url
        if next_parse_url:
            self.crawlpage=self.crawlpage+1
            # 这里只爬取四个3个下一页
            if self.crawlpage< 3:
                next_parse_url=parse.urljoin(response.url,next_pa
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值