上回咱们说到 php
python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!html
WOW!!python
scrapyios
awesome!!nginx
怎么会有这么牛逼的框架web
wow!!数据库
awesome!!json
用 scrapy 来爬取数据ubuntu
岂!不!是!非!常!爽!vim
wow!!
接下来就是我独享的moment
哦不
接下来就是
咱们已经建立了爬取糗事百科的项目
而且把糗事百科的前两页的做者和段子爬取到 json 文件了
此次
咱们将咱们要爬取全部的数据
使用 scrapy 存储到 mangodb 中
在此以前仍是先介绍一下咱们使用 scrapy 建立出来的文件目录
各个文件表明的都是啥意思
省得又有些 b 友当场懵逼
咱们从上往下依个介绍一下
这个 spiders 目录呢
就是用来存放咱们写爬虫文件的地方
items.py
就是用来定义咱们要存储数据的字段
middlewares.py
就是中间件,在这里面能够作一些在爬虫过程当中想干的事情,好比爬虫在响应的时候你能够作一些操做
pipelines.py
这是咱们用来定义一些存储信息的文件,好比咱们要链接 MySQL或者 MongoDB 就能够在这里定义
settings.py
这个文件用来定义咱们的各类配置,好比配置请求头信息等
以上就是 scrapy 生成的目录中主要文件的做用
ok
接下来咱们就进入代码中
咱们上次建立了 QiushiSpider 来写咱们的爬虫
当时咱们只是获取了前两页的数据
咱们要获取全部页面的数据怎么玩呢
打开糗事百科的连接能够看到
13 页的数据
其实按照之前咱们直接写个 for 循环就能够了
不过咱们此次还可使用 scrapy 的 follow 函数
具体使用是这样的
咱们先获取下一页的连接
因为下一页这个按钮都是在最后一个 li 标签中的
因此用 xpath 获取就这样
next_page = response.xpath('//*[@id="content-left"]/ul/li[last()]/a').attrib['href']
接着咱们就可让它去请求下一页的内容数据了
if next_page is not None: yield response.follow(next_page, callback=self.parse)
你也能够用 urljoin 的方式
这样咱们就能够获取到全部页面的数据了
接下来咱们要把全部的数据保存到数据库
首先咱们在 items.py 中定义一下咱们要存储的字段
import scrapy
class QiushibaikeItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() author = scrapy.Field() content = scrapy.Field() scrapy.Field() =
接着咱们在 parse 方法中将获取到的数据赋值给 item
具体来讲就是这样
def parse(self, response):
content_left_div = response.xpath('//*[@id="content-left"]') content_list_div = content_left_div.xpath('./div')
for content_div in content_list_div: item = QiushibaikeItem() item['author'] = content_div.xpath('./div/a[2]/h2/text()').get() item['content'] = content_div.xpath('./a/div/span/text()').getall() item['_id'] = content_div.attrib['id'] yield item
next_page = response.xpath('//*[@id="content-left"]/ul/li[last()]/a').attrib['href']
if next_page is not None: yield response.follow(next_page, callback=self.parse)
第 7 行就是获取咱们刚刚定义的 item 的类
8-10 行就是相应的赋值
那么咱们定义好了要存储的字段以及写好了数据爬取
接下来还有一步
就是定义好咱们要存储的数据库
到 pipelines.py 中
class QiushibaikePipeline(object):
def __init__(self): self.connection = pymongo.MongoClient('localhost', 27017) self.db = self.connection.scrapy self.collection = self.db.qiushibaike
def process_item(self, item, spider): if not self.connection or not item: return self.collection.save(item)
def __del__(self): if self.connection: self.connection.close()
在这里咱们链接到本地的 MongoDB
创建了 scrapy 数据库及如下的 qiushibaike
接下来还要在 settings.py 文件中配置下
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = { 'qiushibaike.pipelines.QiushibaikePipeline': 300,}
这样才可使用到pipelines
固然咱们还能够在 settings.py 里面作更多的设置
好比设置请求头
# Crawl responsibly by identifying yourself (and your website) on the user-agentUSER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36'
ok
搞定了以后
咱们使用命令来抓取一下
scrapy crawl qiushibaike
运行以后
咱们打开 MongoDB 看看
能够看到
全部的数据就被我爬取到 MongoDB 了
ok
以上就是 scrapy 的简单又牛逼的操做
更多 scrapy 的牛逼操做能够前往 https://doc.scrapy.org 了解
这两篇所涉及的源代码已经上传
能够在公众号后台发送 scrapy 获取
那么
咱们下回见
peace
对了
有个事
你但愿接下来这个公众号能有更多什么教程
例如
爬虫实战?
ubuntu?
vim?
...?
请扫下方的码评论告诉我一下