项目简介
使用scrapy+selenium+mysql实现简书文章整站爬取(动态数据)以及数据写入数据库。
项目github地址:https://github.com/lemonSuanSuan/jianshu-scrapy
实现思路
先解惑:为啥要用到selenium?
偶尔,也许小小的眼睛会充满大大的疑惑:代码并没有错,爬取数据的时候有些数据却死活获取不到。其实就是因为那是动态加载的数据,右键-查看网页源代码只能看到当前url获取的内容,看不到动态加载的数据。
现在前后端分离,从后台获取的数据一般都是采取动态加载。对于一些无法通过当前页面url获取的数据,就需要用到Selenium了,它是web应用程序自动化测试工具,能够模拟用户行为,获取动态数据加载后的网页源代码。
scrapy+selenium+mysql整体思路就是:
1.在scrapy框架的下载器中间件中,利用selenium处理请求并拿到完全加载的网页源代码
2.将网页源代码封装成response,在中间件的process_request函数中返回,这样就会直接返回数据全部加载的页面源码给爬虫引擎,request也不会发送到下载器那边去,也就是selenium代替了下载器。
3.最后使用管道pipelines将数据存进数据库。
准备工作
需要安装的第三方库
使用python包管理工具pip下载即可
pip install scrapy
pip install selenium
pip install pymysql
安装mysql
官网下载太慢,所以使用国内镜像源站点下载
这里我使用的是清华的镜像源:https://mirrors.tuna.tsinghua.edu.cn/
进mysql目录,根据自己的电脑系统选择合适的版本下载安装即可(比如windows 64位则ctrl+F搜索winx64,选择最新版的zip包)
image.png
下载谷歌浏览器驱动器chromedriver.exe
根据自己使用的浏览器去下载相应版本的驱动器即可,把它放到python安装目录下,也就是python.exe所在的目录下(放这里是因为不指定路径的话,默认到这里来找驱动程序)
项目构建及具体代码实现
image.png
1.新建项目
scrapy startproject jianshu
2.切换到项目目录下,新建爬虫
-t crawl表示使用CrawlSpider模板。因为这个爬取需要提取链接并且进入详情页获取数据,所以使用CrawlSpider类而不是Spider类
cd jianshu
scrapy genspider –t crawl js “jianshu.com”
3.修改一下settings.py里的一些相关配置
1)设置将遵循机器人协议更改为False。True的话会先在爬取的网站根目录下找robots.txt,如果没有就不抓取内容就返回了,所以更改为False,以防找不到不爬取就返回。
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
2)设置默认请求头User-Agent,伪装一下身份。
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
3)设置下载延迟,不要给人家服务器造成太大压力,适当可以设置延迟一两秒,两三秒……
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 1
4.items.py 定义item容器
根据寄几的的需要定义相应字段,你想要爬取的数据最后都需要装到这里面来传给管道pipelines
import scrapy
class JianshuItem(scrapy.Item):
# 文章id
article_id = scrapy.Field()
# 标题
title = scrapy.Field()
# 文章内容
content = scrapy.Field()
# 作者
author = scrapy.Field()
# 头像
avatar = scrapy.Field()
# 发布时间
pub_time = scrapy.Field()
# 原始url
origin_url = scrapy.Field()
# 字数
word_count = scrapy.F