爬取www.chaoxiubang.com网站的美女写真图片,并存储到本地,把每个写真集的介绍存储到MySQL
项目下载地址:
<pre>https://github.com/TopcoderWuxie/chaoxiubang.git</pre>
美女写真集爬取
用Scrapy爬取一个网站所有分类的图片,并根据分类以及写真集名称实现分目录存储。
网站结构
首页 --> 12个category --> 每个category的所有写真集(里面有分页) --> 每个写真集的图片(获取每个页面的图片url) --> 图片分目录下载
目录结构
如图所示:
爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL爬取的数据
对于每一个分类,获取到的数据如下:
-
category: 写真集分类
-
url: 写真集每张图片的url链接
-
title: 写真集标题
-
update_time: 更新时间
-
click_amount: 点击量
-
tags: 标签
-
content: 写真集简介
针对于爬取到的数据,这里只对下面的三个字段进行处理,category和title进行创建目录,根据url对图片进行下载。 (如果要在本机运行此示例代码,注意修改下对应的文件路径,settings.py中的IMAGES_STORE)
问题处理
- response.meta 传值发生覆盖
在处理的时候发现response.meta传值的过程中发生了覆盖,把所有的图片都存入了一个目录中。 错误原因:二者公用的是同一个内存地址,使用深拷贝来拷贝内存地址,这样可以避免上面的错误。
- 点击量获取
在代码解析的过程中,点击量不能获取到,看了下代码结构,发现那是通过js动态响应的值,所以在这里加了个从js中获取值的解析。
数据存储错误分析
MySQL数据库中存储的是获取到的7个字段,存储到本地。
数据库的创建语句已经给出了,里面的SQL已经测试通过。下面是写SQL的过程中遇到的问题。
- not all arguments converted during string formatting
执行insert的时候前后字段数量不一样
- Error 1064
MySQL语法错误
爬取速度
预计总共有6万张左右的照片需要下载,下面是在本地win7系统测试的结果。
- 图片下载速度
如下图所示,这里下载了部分图片,耗时大约6个小时,所以6万张图片如果全部都存储到本地,则大约耗时18小时左右。(预计如果在Linux或者Mac上面速度可能会更快)
爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL- MySQL数据存储速度
下面发送邮件目录的图片中有爬取耗时,爬虫内部自动记录了爬虫开始的时间以及结束时间。不过观察这两个时间发现,并不与本地的时间(北京时间)一致,所以估计应该是UTC时间。
- MySQL数据存储以及图片下载
如果说把代码全部放到一起的话,预计爬取耗时会在一天左右,毕竟图片下载相对比较耗时。
发送邮件
当爬取结束以后,通过发送邮件提示爬虫已经爬取结束,邮件内容为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
网友评论