码迷,mamicode.com
首页 > 其他好文 > 详细

scrapy基本的流程 糗事百科

时间:2019-01-30 00:13:17      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:随机   def   mongodb   糗事百科   contains   加载   开始   支持   res   

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)#输出源码
View Code

创建入口文件运行

在项目的根目录下创建一个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)
View Code

然后在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,
}
View Code

再次运行,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())
View Code

修改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 
View Code

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

技术分享图片
MONGO_HOST = "127.0.0.1"  # 主机IP
MONGO_PORT = 27017  # 端口号
MONGO_DB = "spider_data"  # 库名
MONGO_COLL = "qsbk"  # collection名
View Code

然后打开pipe通道

 

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

运行查看数据

代码可以在git上查找:

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

 

scrapy基本的流程 糗事百科

标签:随机   def   mongodb   糗事百科   contains   加载   开始   支持   res   

原文地址:https://www.cnblogs.com/xingnie/p/10335931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!