今天跟师弟聊天说到他花钱从淘宝购买表情包,而我自身的表情包也不多,但是网上有很多表情包网站,何不自己爬取搭一个表情包搜索网站呢?因此本文以doutula为演示站点,详细说明从网上使用scrapy爬取表情包并最终搭建一个自己的表情包搜索网站的过程。主要步骤如下:

1. scrapy爬取表情包并存入mysql

2. flask搭建搜索网站

准备工作,anaconda python3

pip install scrapy
pip install flask 
pip install pymysql

1.scrapy爬取表情包并存入mysql

1.1打开网站审查元素

确定css提取规则与mysql表结构。 可以看到主要字段有两个,一个为图片地址,可以看到为新浪来源,确定字段 _imageurl 。一个为表情包描述,在p元素里面,字段为_imagedes 。另外需要一个主键,设为 id 。后续搜索表情包的时候根据描述字段查出表情包地址,直接外链就行。

1.2创建一个表情包的数据库和表

create dataabse bqb;
use bqb;
DROP TABLE IF EXISTS `bqb_scrapy`;
CREATE TABLE `bqb_scrapy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `image_url` varchar(100) NOT NULL,
  `image_des` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_url` (`image_url`)
) ENGINE=InnoDB AUTO_INCREMENT=187800 DEFAULT CHARSET=utf8mb4;

3个字段,自增id,图片地址,图片描述。

1.3编写scrapy爬虫

class DoutulaSpider(scrapy.Spider):
    name = 'doutula'
    allowed_domains = ['doutula.com']
    start_urls = ['https://www.doutula.com/photo/list/']
    for i in range(2,2773):
        start_urls.append("https://www.doutula.com/photo/list/?page={}".format(i))

    def parse(self, response):
        item = {}
        item['image_url'] = response.css("div.random_picture").css("a>img::attr(data-original)").extract()
        item['image_des'] = response.css("div.random_picture").css("a>p::text").extract()
        yield item

表情包一共有2773页,爬取规则 _response.css(“div.randompicture”).css(“a>img::attr(data-original)“).extract() 可以获得一个表情包地址的list,而 _item[‘image_des’] = response.css(“div.randompicture”).css(“a>p::text”).extract() 可以得到表情包的描述

1.4编写scrapy pipline存入mysql

import pymysql
class BqbPipeline(object):
    def open_spider(self,spider):
        self.mysql_con = pymysql.connect('localhost', 'youruser', 'yourpass', 'bqb',autocommit=True)
        self.cur = self.mysql_con.cursor()

    def process_item(self, item, spider):
        for i in range(len(item['image_url'])):
            query = 'insert into bqb_scrapy(`image_url`,`image_des`) values("{}","{}");'.format(item['image_url'][i],item['image_des'][i])
            self.cur.execute(query)
        return item


    def close_spider(self, spider):
        self.mysql_con.close()

pymysql的使用,在mysql数据库连接中使用autocommit使得自动确认插入操作。

1.5 item等以及scrapy开始爬取

接下来需要把setting.py的pipeline注释部分取消使得存入数据库操作可以起作用,另外就是item.py确定item中的两个元素

import scrapy
class BqbItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    image_url = scrapy.Field()

    image_des = scrapy.Field()

运行爬虫就可以了,在项目根目录运行

scrapy crawl doutula

可以看到数据在疯狂地存入数据库了 store_image 到这里,第一步scrapy爬取表情包并存入mysql数据库就已经完成了。

2.flask搭建搜索网站

flask app中需要三个页面,首页,搜索并展示功能,404页面。 网站主程序 bqb.py

import pymysql
from flask import Flask
from flask import request, render_template



app = Flask(__name__)
def db_execute(keyword):
     conn = pymysql.connect('localhost', 'youruser', 'yourpass', 'bqb')
     query = 'select image_url,image_des from bqb_scrapy where image_des like "%{}%" limit 1000;'.format(keyword)
     cur = conn.cursor()
     cur.execute(query)
     res = cur.fetchall()
     cur.close()
     conn.close()
     return res

@app.route('/', methods=['GET', 'POST'])
def search():
    if request.method == 'GET':
        return render_template('index.html')

    elif request.method == 'POST':
        keyword = request.form.get('keyword').strip()
        items = db_execute(keyword)
        if items != None:
            return render_template('bqb.html', list=items)
        else:
            return 'not found'

    else:
        return render_template('404.html')


if __name__ == '__main__':
    #print(db_execute(u"呵呵")) 
    app.run(host='0.0.0.0',port=555)

这样就完成了,本地444端口,使用nginx反向代理就行,域名为 bqb.bobobk.com,查看效果

search_bqb get_bqb

这样一个表情包搜索网站就搭好了,斗图的时候再也不用担心没有表情包可用了。