机器学习与数据挖掘Python 爬虫 web 数据分析 机器学习 人工智能大数据 爬虫Python AI Sql

爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL

2018-05-13  本文已影响61人  Python雁横

爬取www.chaoxiubang.com网站的美女写真图片,并存储到本地,把每个写真集的介绍存储到MySQL



项目下载地址:

<pre>https://github.com/TopcoderWuxie/chaoxiubang.git</pre>



美女写真集爬取

用Scrapy爬取一个网站所有分类的图片,并根据分类以及写真集名称实现分目录存储。

网站结构

首页 --> 12个category --> 每个category的所有写真集(里面有分页) --> 每个写真集的图片(获取每个页面的图片url) --> 图片分目录下载

目录结构

如图所示:

爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL

爬取的数据

对于每一个分类,获取到的数据如下:

针对于爬取到的数据,这里只对下面的三个字段进行处理,category和title进行创建目录,根据url对图片进行下载。 (如果要在本机运行此示例代码,注意修改下对应的文件路径,settings.py中的IMAGES_STORE)

问题处理

在处理的时候发现response.meta传值的过程中发生了覆盖,把所有的图片都存入了一个目录中。 错误原因:二者公用的是同一个内存地址,使用深拷贝来拷贝内存地址,这样可以避免上面的错误。

在代码解析的过程中,点击量不能获取到,看了下代码结构,发现那是通过js动态响应的值,所以在这里加了个从js中获取值的解析。

数据存储错误分析

MySQL数据库中存储的是获取到的7个字段,存储到本地。

数据库的创建语句已经给出了,里面的SQL已经测试通过。下面是写SQL的过程中遇到的问题。

执行insert的时候前后字段数量不一样

MySQL语法错误

爬取速度

预计总共有6万张左右的照片需要下载,下面是在本地win7系统测试的结果。

如下图所示,这里下载了部分图片,耗时大约6个小时,所以6万张图片如果全部都存储到本地,则大约耗时18小时左右。(预计如果在Linux或者Mac上面速度可能会更快)

爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL

下面发送邮件目录的图片中有爬取耗时,爬虫内部自动记录了爬虫开始的时间以及结束时间。不过观察这两个时间发现,并不与本地的时间(北京时间)一致,所以估计应该是UTC时间。

如果说把代码全部放到一起的话,预计爬取耗时会在一天左右,毕竟图片下载相对比较耗时。

发送邮件

当爬取结束以后,通过发送邮件提示爬虫已经爬取结束,邮件内容为Scrapy内置的内容,并没有进行修改。

发送邮件只需要配置settings.py文件的相关字段即可,其它地方没有进行修改。

修改配置如图:

爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL

爬虫代码结束后邮件内容如图所示:

爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL

代码展示:

-- coding: utf-8 --

2

3 # Define your item pipelines here

4 #

5 # Don't forget to add your pipeline to the ITEM_PIPELINES setting

6 # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

7

8 import sys

9 reload(sys)

10 sys.setdefaultencoding("utf8")

11

12 import urllib

13 import pymysql

14 import os, os.path

15 from beauty.settings import IMAGES_STORE, MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_USR, MYSQL_PWD, MYSQL_CHARSET

16

17 class BeautyPipeline(object):

18

19 def init(self):

20 self.conn = pymysql.connect(

21 host = MYSQL_HOST,

22 port = MYSQL_PORT,

23 user = MYSQL_USR,

24 passwd = MYSQL_PWD,

25 db = MYSQL_DB,

26 charset = MYSQL_CHARSET,

27 )

28

29 self.insert_sql = "insert into meizi(category, title, url, update_time, click_amount, tags, content) values('%s', '%s', '%s', '%s', '%s', '%s', '%s');"

30

31 def process_item(self, item, spider):

32

33 # 数据存储

34 self.cur = self.conn.cursor()

35 try:

36 self.cur.execute(self.insert_sql % (item['category'], item['title'], item['url'], item['update_time'], item['click_amount'], item['tags'], item['content']))

37 self.conn.commit()

38 except Exception as e:

39 self.conn.rollback()

40

41 # 图片下载

42 category = item['category'].replace(u"/", u"-").replace(u"?", u"").replace(u"", u"-")

43 title = item['title'].replace(u"/", u"-").replace(u"?", u"").replace(u"", u"-")

44 url = item['url']

45 file_name = url.split(u"/")[-1].replace(u"/", u"-").replace(u"?", u"").replace(u"", u"-")

46 file_path = os.path.join(IMAGES_STORE, category, title)

47 if not os.path.exists(file_path):

48 os.makedirs(file_path)

49 file_path = os.path.join(file_path, file_name)

50 if not os.path.exists(file_path):

51 urllib.urlretrieve(url, file_path)

52

53 return item

上一篇 下一篇

猜你喜欢

热点阅读