Skip to content

Scrapy, tianya, 天涯; scrapy django增量抓取天涯莲蓬鬼话全部帖子

Notifications You must be signed in to change notification settings

lifefloating/scrapy_django_tianya

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

scrapy_django_tianya

OSCS Status

天涯 tianya - Scrapy+Django 增量抓取天涯莲蓬鬼话
目标网址莲蓬鬼话

Scrapy文档

bi~传送门scrapy官方文档1.4.0

Django文档

bi~传送门django文档

主要过程

* scrapy+django环境搭建
* 数据库结构设计
* scrapy代码实现 去重与增量
* 反爬策略
* 数据用于django页面的展示
* 部署至centos 周期性抓取 (虚拟机暂时熟悉下部署流程)     

Scrapy+Django环境搭建

这里用Django的modes层来作为scrapy的item定义


网上有很多关于这种教程推荐看下:http://blog.csdn.net/clayanddev/article/details/53768975

  • 环境配置

google!
django和scrapy改怎么搞怎么搞不介绍过多,重点是下面的一段,不然很可能按照上面教程走下来无法完成环境搭建

在spider文件夹同级目录下的__init__.py文件里加上下面代码:
import os, sys, django
sys.path.append(r'E:\PythonProject\scrapy_django_tianya2\tianya') # `填你的django项目路径`
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tianya.settings") # django项目.settings
django.setup()

这样大体环境搭建完成!

数据库设计


代码在Django的Models.py那里
需要注意的是story表的话story_link 唯一索引 story_mark,story_order联合索引
这里的联合索引是后面数据查询的必要条件,因为数据量略大story表100多w数据,查询条件还是加个索引

数据库表数据概略


tianya_index表

tianya_story表 目前103w的帖子

tianya_story表 目前103w的帖子

scrapy代码实现 去重与增量

我讲下思路和流程吧,因为代码注释很全了已经。

  • 全量以及去重

* 目标网址是天涯的莲蓬鬼话全部帖子的章节,首先可以先做一次全量,虽然可能不全,但是无妨
先把全部帖子的全部url抓下来,xpath找到首页全部url,找到下一页,如此直到没有下一页为止,url的入口链接已经基本拿到

每个url一个主题帖,里面有很多个页,每一页有多个章节,多页的url可以通过抓取最后一页的url再去拼接出全部url
拿到全部url之后,再写个spider去处理这些url的帖子item,这个时候可以考虑多进程,所以这里需要去重,多个进程去取url跑
难免会有重复的,跑之前取到的url先random.shuffle一下,这里去重方案我是将全部url取出放置Redis,
每当爬取或者因为需要丢弃这个url,这个url再Redis中对于的value改为1,没有爬取的value为0,每次只从value为0的中取key作为url
其实这里有缺陷,就是效率问题,如果有更好方案希望私我,scrapy-redis暂时不考虑

  • 增量与去重

* 增量 对比回复时间与上次的回复时间,判断是否更新
首页的url和story_index表中story_link_main`比较`如果他存在与说明不是全新的帖子
这里与数据库交互一次,顺带说下django自带的数据库驱动是MySQLdb暂时不支持python3.6的,我使用的pymysql
在你的Django项目同名文件夹里面的__init__.py文件中添加如下代码(这里就是tianya下面的__init__.py):
import pymysql
pymysql.install_as_MySQLdb()

index只`更新`时间,帖子从后面开始抓取5页比较,这里是为了减少爬取量,不排除可能有漏掉的情况
这里也与数据库交互一次
否则是全新的帖子,从最后一页开始全部抓取

反爬策略


反爬策略有很多,但是无非都是在中间件那里做一些处理cookie, ua useragent,ip池代理,以及settings.py的相关参数设置,都是模拟浏览器行为
网上同样有资料可以参考:http://blkstone.github.io/2016/03/02/crawler-anti-anti-cheat/
莲蓬鬼话并没有要求验证码或者登陆之类的,我只是加了个useragent代理,本来想加个ip代理,但是没有发现可用的ip,卒。

Django页面的编写

这里的页面实现不复杂,Django了解的人应该可以看懂,唯一查询中不要用like这里,之前我用了,不建议用
我这里用了bootstrap的样式,在static静态文件中引入就好。

部署至centos

centos上的文件为centos_file_main,静态文件被我删了,太多,在centos上部署需要注意数据库相关的地方url需要修改
一些配置文件也上传至此,部署时,我自己的注意点在txt文件中。
部署我参考了两个教程,非常感谢这些乐于分享的人
centos下配置django、uwsgi和nginx http://blog.csdn.net/chenkfkevin/article/details/78297666
centos7下采用Nginx+uwsgi来部署django https://www.cnblogs.com/sumoning/p/7147755.html
supervisor 从安装到使用 https://www.jianshu.com/p/3658c963d28b

Django项目图片


  • 首页


  • 首页分页

  • 详细页

  • 详细页分页

之前方案已经删除,新版本scrapy_django_tianya_new


  • 修改思路

   
     之前的方案是按照比对时间,给每段故事的章节拼接一个唯一的标记url,虽然顺序可以保证一致,但是不排除其他特殊情况顺序会错,    
     现在发现原帖中已经有这样的标记,replyid,加上时间既可以标记唯一顺序,对每段内容做md5,在一定时间范围内的故事更新比对其md5    
     正常比对时间就行,以上比对的方案是用于有些内容作者在上次帖中更新。

About

Scrapy, tianya, 天涯; scrapy django增量抓取天涯莲蓬鬼话全部帖子

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages