首页 > 代码库 > 爬取知名社区技术文章_分析_1

爬取知名社区技术文章_分析_1

软件运行环境是什么?

       python 3.50                                      -- 解释器

       scrapy库                                         -- 爬虫框架

       pymsql库                                         -- 连接mysql数据库

       pillow库                                           -- 下载图片

目标网站是什么?

       伯乐在线:http://blog.jobbole.com/  所有的技术文章

需要爬取哪些数据?

       文章对应的url             cont_url                              varchar(512)

  文章标题                     title                                     varchar(36)

  文章发布时间              publish_time                      data(1970-1-1)

  文章内容                     cont                                    longtext

  对应图片url                img_url                               varchar(512)

  下载对应的图片           scrapy带的下载器

  文章点赞数                  like_num                            int(12)

  文章收藏数                  collection_num                  int(12)

  文章评论数                  comment_num                  int(12)

       对于这些数据如何设计表?

              每个数据都是文章的详情页面的唯一数据,不存在冗余数据,所有一张表就可以了

              表名:jobbole_article

              主键:把文章对应的url进行md5处理,做primarykey      int(64)

       事先把数据表建立起来,pymysql只需要插入数据就行了

如何进行事先分析?

  打开这个域名,浏览一下网页,分析网页的域名设计,分析有没有显示全部文章的url,发现 “最新文章” 这个链接地址,直接把所有的文章都显示出来,就以这个为起始网页,这个网站为:http://blog.jobbole.com/all-posts/

  分析这个网页可以获得的数据,发现可以获得详情文章页面url有20个、文章对应的图片、下一页的url,通过详情页面,进入可以爬取符合需求的值,通过下一页url,就可以获取下一页的所有文章详情的url

  边界值分析:

    试着点开第二页,分析上一页url和下一页url区别

    试着点到最后一页,发现没有下一页url,这时爬虫应该结束了,需要对爬取下一页的url进行逻辑判断处理

如何逻辑实现?

  1. 定义一个函数在http://blog.jobbole.com/all-posts/页面中解析详情文章页面所有的url,交个scrapy下载器去下载,并把下载好的页面交个另外解析函数去获取有效字段,解析获取的图片url,交给scrapy图片下载器去下载
  2. 获得初始数据,然后对初始数据进行格式化处理,去脏处理,获取有效数据
  3. 把有效的字段,通过pymysql连接数据库,并写入数据库

逻辑结构如何?

       该爬虫分为:5个逻辑结构

              解析文章简介页面             

              解析文章详情页面

              获得原始数据

              数据去脏处理

              写入数据库(通过twisted的异步框架实现异步存储)

出现的问题?

       如何异步实现数据库的插入?

#声明:代码逻辑而已,参考
#1. 在setting中写入数据库连接配置详细
#2. 定义一个类:
from twisted.enterprice import adbapi

class TwistSql(object)

       def __init__(self, dbpool):

              self.dbpool = dbpool          # 接收fromz_setting传入的dbpool对象

       @classmethod

       def  fromz_setting(cls,setting):                      # 一个获取setting值的方法

              db_setting = setting[‘db_setting’]            # 获取配置文章中数据库配置信息

charset=’utf8’ 、cursorclass = pymysql.cursors.DictCursor 、use_unicded=Terue 必写入字典

              dbpool = adbapi.ConnectionPool(‘pymysql’,**kwarg)   # 生成一个pool对象

       return cls(dbpool)       # 因为classmethod类方法,return 会把参数传给这个类

       def process_item(self, item, spider): # twisted 将mysql插入变成异步

              query = self.dbpool.runInteraction(self.insert_go, item)

# 把传入的函数变成异步执行,可以返回一个对象

              query.addErrorback(self. handle_error, item, spider)   # 添加异常处理

       def handle_error(self, failur, item, spider):

              print(failur)

       def insert_go(self, cursor, item):       # 这个cursor和pymysql生成的游标类似

                     #执行具体的插入

              sql_insert = sql语句拼接

              cursor.execute(sql_insert)              

# cursor为游标,twisted帮做了连接拿到游标,并且自动会commit

       如何自动下载图片并且获得图片下载的路径?

# 声明,代码逻辑而已,仅供参考
setting:

         注册时候,把自定义类加入

                            IMAGES_URLS_FILED = “img_url”

# img_url 为图片的下载路径,Items中必有该字段且img_ur 为数组模式,需要在爬虫主程序中把这个字段改成数组

                                   import os

                                   project_dir = os.path.abspath(os.path.dirname(__file__)                 

# 获得工程路径

                                   IMAGES_STORE = os.path.join(project_dir, ‘images’)        # 字符串拼接

                                          # 设置图片下载路径

                     pipelines:

                            form scrapy.piplines.image import ImagePipeline

                            重载ImagePipeline中一个方法

                class MyImagePipline(ImagePipeline):

                       def item_completed(self, results,info):  # result 中包含图片存放路径

                              for k,v in result:

                                     img_path = v(‘path’)                 

# k为图片获取状态,True为获取成功

# v为图片路径

                              return item[‘img_path’] = img_path

图片处理类的优先级应该设置为最先

  

爬取知名社区技术文章_分析_1