python 爬虫源码 selenium并存储数据库_python简书爬虫完整代码及详细笔记(scrapy+selenium+mysql)...

项目简介

使用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包)

49ce5dc63a3f

image.png

下载谷歌浏览器驱动器chromedriver.exe

根据自己使用的浏览器去下载相应版本的驱动器即可,把它放到python安装目录下,也就是python.exe所在的目录下(放这里是因为不指定路径的话,默认到这里来找驱动程序)

项目构建及具体代码实现

49ce5dc63a3f

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得。 这说明我们想要的元素是在我们的某些操作下通过js事件动态生成的。举个例子,我们在刷QQ空间或者微博评论的时候,一直往下刷,网页越来越长,内容越来越多,就是这个让人又爱又恨的动态加载。 爬取动态页面目前来说有两种方法 分析页面请求(这篇介绍这个) selenium模拟浏览器行为(霸王硬上弓,以后再说) 言归正传,下面介绍一下通过分析页面请求的方法爬取动态加载页面的思路。中心思想就是找到那个发请求的javascript文件所发的请求。 举两个例子,京东评论和上证股票。 后注:本文的两个例子都是get请求,可以显示的在浏览器中查看效果,如果是post请求,需要我们在程序中构造数据,构造方法可以参考我从前的一篇博文Scrapy定向爬虫教程(六)——分析表单并回帖。 京东评论 这是一个比较简单的例子。 首先我们随便找一个热卖的商品,评论比较多。 就这个吧威刚(ADATA) SU800 256G 3D NAND SATA3固态硬盘。 点进去看看这个页面现在的状况 图一 滚动条给的第一印象感觉这页仿佛没多少内容。 键盘F12打开开发者工具,选择Network选项卡,选择JS(3月12日补:除JS选项卡还有可能在XHR选项卡中,当然也可以通过其它抓包工具),如下图 图二 然后,我们来拖动右侧的滚动条,这时就会发现,开发者工具里出现了新的js请求(还挺多的),不过草草翻译一下,很容易就能看出来哪个是取评论的,如下图 图三 好,复制出js请求的目标ur

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值