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

时间:2021-07-19 20:27:24

软件运行环境是什么?

       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      varchar(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个逻辑结构

              解析文章简介页面             

              解析文章详情页面

              获得原始数据

              数据去脏处理

              写入数据库(通过gevent的协程实现存储)

出现的问题?

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

    通过协程实现对数据的插入

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

    通scrapy自带下载器,和重新定义scrapy的imagepipeline中一个方法获得