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. POJ 1511 Invitation Cards(逆向思维 SPFA)

    Description In the age of television, not many people attend theater performances. Antique Comedians ...

  2. WPF 一个性能比较好的 gif 解析库

    本文介绍 Magick.NET ,这是 ImageMagick 的 .Net 封装,他支持 100 多种格式的图片,而 gif 也是他支持的.本文告诉大家如何使用这个库播放 gif 图 先给大家看一下 ...

  3. dotnet 通过 WMI 获取指定进程的输入命令行

    本文告诉大家如何使用 WMI 通过 Process 获取这个进程传入的命令行 使用下面代码,使用 Win32_Process 拿到所有的进程,通过 WHERE 判断当前的进程,然后拿到进程传入的命令 ...

  4. KAFKA报错:COMMIT CANNOT BE COMPLETED SINCE THE GROUP HAS ALREADY REBALANCED AND ASSIGNED THE PARTITIONS TO ANOTHER MEMBER

    转载:https://www.greenhtml.com/archives/Commit-cannot-be-completed-since-the-group-has-already-rebalan ...

  5. QString 转换为 char *

    一.QString 转换为 char * 将 QString 转 char *,需要用到 QByteArray 类,QByteArray 类的说明详见 Qt 帮助文档. 因为 char * 最后都有一 ...

  6. hibernate_检索策略

    一.概述 检索策略分三大块,类级别检索策略和关联级别检测策略. 类级别检索策略:get.load. 关联级别检索策略:order.getCustomer().getName() 上面这两种应该是看得懂 ...

  7. 006.MFC_对话框_复选框_单选钮

    对话框和控件复选框单选框分组框示例:三原色画图 一.建立名为Demo2的MFC工程,按照下图添加控件 并修改2个Group Box Caption属性分别为颜色.外观 修改3个Check Box Ca ...

  8. Vijos1917 艾酱最喜欢的数字 [求绝对众数]

    1.题意:第一行一个数字N,表示一共有多少个数字,第二行N个数字,保证其中至少有一个数字出现次数超过一半,任务是求出这个出现最多的数. 2.分析:本题是明显的求众数的问题,常规思路为开一个大数组,在读 ...

  9. Django的安装命令

    国内的一些pipy镜像源: 1.清华源: https://pypi.tuna.tsinghua.edu.cn/simple 2.豆瓣源: https://pypi.douban.com/simple ...

  10. 人生苦短,我用Python(4)

    1.创建数值元组: 在Python中,使用tuple()函数直接将range()函数循环出来的结果转换为数值元组. tuple(data) #tuple()函数的基本语法 data表示可以转换为元组的 ...