美文网首页机器学习与数据挖掘Python 爬虫 web 数据分析 机器学习 人工智能大数据 爬虫Python AI Sql
爬取网站的美女写真图片,并存储到本地,写真集介绍存储到MySQL

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

作者: Python雁横 | 来源:发表于2018-05-13 00:12 被阅读61次

    爬取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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ngrkdftx.html