https://www.cnblogs.com/c-x-a/p/9889623.html

创建scrapy工程

1、scrapy startproject xxx xxx就是你的项目名,这里我们给我们的项目起名qiushibaike。

然后我们会发现了多了一个文件名为qiushibaike的文件夹

scrapy startproject xxx

2、然后我们通过命令创建一个事例工程

cd qiushibaike

3、然后用下面scrapy的第二个命令genspider
使用方法 scrapy genspider spider_name domain
spider_name就是爬虫的名字,每一个爬虫有一个名字这个名字是唯一的,后面运行的时候也是通过这个名字来运行的,下面的qsbk就是我们的爬虫名字,domain指定爬虫的域也就是爬虫的范围。查找网页我们发现域名为qiushibaike.com

scrapy genspider qsbk qiushibaike.com

开始编写spider文件

用pycharm把我们的爬虫工程加载进来。

修改settings.py文件

无视robots协议,将ROBOTSTXT_OBEY = True 改为ROBOTSTXT_OBEY = False

修改spider.py

看看我们访问的网页源码对不对。
把qsbk.py 进行修改

# -*- coding: utf-8 -*-
import scrapy class QsbkSpider(scrapy.Spider):
name = 'qsbk'
allowed_domains = ['qiushibaike.com']
start_urls = ['http://qiushibaike.com/']#种子url,列表类型表示支持多个 def parse(self, response):
print(response.text)#输出源码

创建入口文件运行

在项目的根目录下创建一个run.py 来运行我们的工程
run.py的内容如下

# -*- coding: utf-8 -*-
# @Time : 2018/10/31 11:54 PM
# @Author : cxa
# @File : run.py.py
# @Software: PyCharm
from scrapy.cmdline import execute
execute(['scrapy','crawl','qsbk'])

运行以后找到了error关键字,可以得知爬虫出错了

修改中间件加入headers信息

首先修改middlewares.py

class UserAgentMiddleware(object):

    def __init__(self, user_agent_list):
self.user_agent = user_agent_list @classmethod
def from_crawler(cls, crawler, *args, **kwargs):
# 获取配置文件中的MY_USER_AGENT字段
middleware = cls(crawler.settings.get('MY_USER_AGENT'))
return middleware def process_request(self, request, spider):
# 随机选择一个user-agent
request.headers['user-agent'] = random.choice(self.user_agent)

然后在settings启用我们的中间件和设定MY_USER_AGENT的值:

MY_USER_AGENT = ["Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36",
"Mozilla/5.0+(Windows+NT+5.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/28.0.1500.95+Safari/537.36+SE+2.X+MetaSr+1.0",
"Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/50.0.2657.3+Safari/537.36"] DOWNLOADER_MIDDLEWARES = {
'qiushibaike.middlewares.UserAgentMiddleware': 543,
}

再次运行,run.py文件,成功获取了源码

解析网页中所需要的内容

因为这10页的结构是类似的我们就拿第一页为例:
在这里我们使用的解析方法为xpath,通过xpath可以解析出我们需要的内容,
打开谷歌浏览器的开发者工具,首先通过Elements模块获取当前页所有内容的大概区域我们可以写这样的一个xpath。

"//div[@id='content-left']"

然后我们发现一页25个内容,然后再去在每个内容里进行查找当前的标题和内容。
在qsbk.py文件的parse方法里加入这段内容

content_left_node=response.xpath("//div[@id='content-left']") #确定发布区的节点区域
div_node_list=content_left_node.xpath("./div")
for div_node in div_node_list:
title_node=div_node.xpath(".//div[@class='author clearfix']/a[contains(@onclick,'web-list-author-text')]/h2/text()")
content_node=div_node.xpath(".//div[@class='content']/span[1]")
content=content_node.xpath('string(.)')
print("发布者",title_node.extract_first().strip())
print("发布内容",content.extract_first().strip())

修改scrapy的日志显示等级方便查看

修改settings.py文件通过修改log的等级,只显示指定类型的log,打开settings.py我们加上下面的一句来设定log的等级为error
也就是只有错误的时候才显示scrapy的log信息。

LOG_LEVEL = "ERROR"

保存结果到mongodb

mongodb是一个key-value型的数据库,使用起来简单,数据结构是键值对类型,在存储过程中如果表不存在就会创建一个新的表。
下面我们开始来存储我们的数据。

构造数据

因为我们需要接收一个键值对类型的数据,一般用dict,所以我们将代码改成如下形式。qsbk.py文件新增内容:

 item = {}
item['name'] = name
item['info'] = info
yield item

上面我们构造出了我们需要存储的数据,然后通过yield传递到存储部分,
下一步我们就要开始创建mongo连接的部分了

创建mongo连接文件

把pipelines.py 文件改为

import pymongo
from scrapy.conf import settings class MongoPipeline(object):
def __init__(self):
# 链接数据库
self.client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['MONGO_PORT'])
if settings.get('MINGO_USER'):
self.client.admin.authenticate(settings['MINGO_USER'], settings['MONGO_PSW'])
self.db = self.client[settings['MONGO_DB']] # 获得数据库
self.coll = self.db[settings['MONGO_COLL']] # 获得collection def process_item(self, item, spider):
postItem = dict(item) # 把item转化成字典形式
self.coll.insert(postItem) # 向数据库插入一条记录
return item

然后修改settings.py,首先添加mongo的几个连接参数

MONGO_HOST = "127.0.0.1"  # 主机IP
MONGO_PORT = 27017 # 端口号
MONGO_DB = "spider_data" # 库名
MONGO_COLL = "qsbk" # collection名

然后打开pipe通道

ITEM_PIPELINES = {
'qiushibaike.pipelines.MongoPipeline': 300,
}

运行查看数据

代码可以在git上查找:

https://github.com/muzico425/qsbk.git

scrapy基本的流程 糗事百科的更多相关文章

  1. 爬虫_糗事百科(scrapy)

    糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...

  2. 新手学习爬虫之创建第一个完整的scrapy工程-糗事百科

    创建第一个scrapy工程-糗事百科 最近不少小伙伴儿,问我关于scrapy如何设置headers的问题,时间久了不怎么用,还真有的忘,全靠记忆去写了,为了方便大家参考,也方便我以后的查阅,这篇文章就 ...

  3. python scrapy实战糗事百科保存到json文件里

    编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...

  4. python爬虫30 | scrapy后续,把「糗事百科」的段子爬下来然后存到数据库中

    上回我们说到 python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害! WOW!! scrapy awesome!! 怎么会有这么牛逼的框架 wow!! awesome!! 用 ...

  5. python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

    是时候给你说说 爬虫框架了 使用框架来爬取数据 会节省我们更多时间 很快就能抓取到我们想要抓取的内容 框架集合了许多操作 比如请求,数据解析,存储等等 都可以由框架完成 有些小伙伴就要问了 你他妈的 ...

  6. scrapy实战4 GET方法抓取ajax动态页面(以糗事百科APP为例子):

    一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析.本篇文章则是通过利用fiddler抓包获取j ...

  7. 21天打造分布式爬虫-Spider类爬取糗事百科(七)

    7.1.糗事百科 安装 pip install pypiwin32 pip install Twisted-18.7.0-cp36-cp36m-win_amd64.whl pip install sc ...

  8. [爬虫]用python的requests模块爬取糗事百科段子

    虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更 ...

  9. python_爬虫一之爬取糗事百科上的段子

    目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面  requests官方教程 使用 ...

随机推荐

  1. P1075 语句解析

    题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数]; ...

  2. h5&css3

    HTML5 HTML5简介 万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改.作为新HTML语言,具有新的元素,属性和行为 它具有更大的技术集,允许更多样化和强 ...

  3. koa2--05.koa-bodyparser中间件的使用,处理post数据

    首先在项目文件夹下使用cmd,输入: npm install --save koa-bodyparser //koa koa-bodyparser中间件的使用 --post提交数据 const koa ...

  4. IIS 6和IIS 7 中设置文件上传大小限制设置方法,两者是不一样的

    在IIS 6.0中设置文件上传大小的方法,只要设置httpRuntime就可以了 <system.web> <httpRuntime executionTimeout="3 ...

  5. 常用linux 命令

    ls -lt 时间倒序 ls -ltr 时间正序 ls -lS 大小倒序 ls -li 显示inode ----------------- cat smb_quicktest.py| grep -E ...

  6. git之github解决冲突

    1.先创建一个txt文件,并进行编辑 2.然后推送到github,过程看之前的教程. 3.在另一个文件夹拉取(用小乌龟拉取),分别在克隆文件夹和原本文件夹操作test.txt. 4.把本体推送给服务器 ...

  7. 23.logging

    转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html 一 (简单应用) import logging logging.debug('de ...

  8. mysql主从之半同步复制和lossless无损复制

    一 MySQL 的三种复制方式 1.1 简介 asynchronous 异步复制 fully synchronous 全同步复制 Semisynchronous 半同步复制 从MySQL5.5 开始, ...

  9. mysql主从之binlog的工作模式

    一 三种模式介绍 1.1 查看mysql主库的binlog格式 binlog仅在主库设置即可,从库无需设置 binlog的默认方式为STATEMENT ( show variables like '% ...

  10. Python3 虚拟开发环境搭建

    虚拟环境的搭建 优点 1.使不同应用开发环境相互独立 2.环境升级不影响其他应用,也不会影响全局的python环境 3.防止出现包管理混乱及包版本冲突 windows 安装 # 建议使用pip3安装到 ...