首页 > 代码库 > 爬取知名社区技术文章_分析_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进行逻辑判断处理
如何逻辑实现?
- 定义一个函数在http://blog.jobbole.com/all-posts/页面中解析详情文章页面所有的url,交个scrapy下载器去下载,并把下载好的页面交个另外解析函数去获取有效字段,解析获取的图片url,交给scrapy图片下载器去下载
- 获得初始数据,然后对初始数据进行格式化处理,去脏处理,获取有效数据
- 把有效的字段,通过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