准备工作,anaconda python3
pip install scrapy
pip install flask
pip install pymysql
确定css提取规则与mysql表结构。
可以看到主要字段有两个,一个为图片地址,可以看到为新浪来源,确定字段 image_url 。一个为表情包描述,在p元素里面,字段为_image_des_ 。另外需要一个主键,设为 id 。后续搜索表情包的时候根据描述字段查出表情包地址,直接外链就行。
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,图片地址,图片描述。
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.random_picture”).css(“a>img::attr(data-original)”).extract() 可以获得一个表情包地址的list,而 item[‘image_des’] = response.css(“div.random_picture”).css(“a>p::text”).extract() 可以得到表情包的描述
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使得自动确认插入操作。
接下来需要把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
可以看到数据在疯狂地存入数据库了
[外链图片转存失败(img-rKDVM1T4-1568016109016)(https://www.bobobk.com/wp-content/uploads/2019/09/mysql_store.webp)]
到这里,第一步scrapy爬取表情包并存入mysql数据库就已经完成了。
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,查看效果
https://www.bobobk.com/471.html