爬虫--使用scrapy爬取糗事百科并在txt文件中持久化存储

工程目录结构

 spiders下的first源码

  

# -*- coding: utf-8 -*-
import scrapy
from  firstBlood.items  import FirstbloodItem
class FirstSpider(scrapy.Spider):
    #爬虫文件的名称
    #当有多个爬虫文件时,可以通过名称定位到指定的爬虫文件
    name = ‘first‘
    #allowed_domains 允许的域名 跟start_url互悖
    #allowed_domains = [‘www.xxx.com‘]
    #start_url 请求的url列表,会被自动的请求发送
    start_urls = [‘https://www.qiushibaike.com/text/‘]
    def parse(self, response):
        ‘‘‘
        解析请求的响应
        可以使用正则,XPATH  ,因为scrapy 集成了XPATH,建议使用XAPTH
        解析得到一个selector
        :param response:
        :return:
        ‘‘‘
        all_data = []
        div_list=response.xpath(‘//div[@id="content-left"]/div‘)
        for div in div_list:
            #author=div.xpath(‘./div[1]/a[2]/h2/text()‘)#author 拿到的不是之前理解的源码数据而
            # 是selector对象,我们只需将selector类型对象下的data对象拿到即可
            #author=author[0].extract()
            #如果存在匿名用户时,将会报错(匿名用户的数据结构与登录的用户名的数据结构不一样)
            ‘‘‘ 改进版‘‘‘

            author = div.xpath(‘./div[1]/a[2]/h2/text()| ./div[1]/span[2]/h2/text()‘)[0].extract()
            content=div.xpath(‘.//div[@class="content"]/span//text()‘).extract()
            content=‘‘.join(content)
            #print(author+‘:‘+content.strip(‘ \n \t ‘))

        #基于终端的存储
        #     dic={
        #         ‘author‘:author,
        #         ‘content‘:content
        #     }
        #     all_data.append(dic)
        # return all_data
        #持久化存储的两种方式
            #1 基于终端指令:parse方法有一个返回值
              #scrapy crawl first -o qiubai.csv --nolog
              #终端指令只能存储json,csv,xml等格式文件
            #2基于管道
            item = FirstbloodItem()#循环里面,每次实例化一个item对象
            item[‘author‘]=author
            item[‘content‘]=content
            yield item #将item提交给管道

Items文件

  

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class FirstbloodItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #item类型对象 万能对象,可以接受任意类型属性,字符串,json等
    author = scrapy.Field()
    content = scrapy.Field()

pipeline文件

  

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

#只要涉及持久化存储的相关操作代码都需要写在该文件种
class FirstbloodPipeline(object):
    fp=None
    def open_spider(self,spider):
        print(‘开始爬虫‘)
        self.fp=open(‘./qiushibaike.txt‘,‘w‘,encoding=‘utf-8‘)
    def process_item(self, item, spider):
        ‘‘‘
        处理Item
        :param item:
        :param spider:
        :return:
        ‘‘‘
        self.fp.write(item[‘author‘]+‘:‘+item[‘content‘])
        print(item[‘author‘],item[‘content‘])
        return item
    def close_spider(self,spider):
        print(‘爬虫结束‘)
        self.fp.close()

Setting文件

# -*- coding: utf-8 -*-

# Scrapy settings for firstBlood project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://doc.scrapy.org/en/latest/topics/settings.html
#     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://doc.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = ‘firstBlood‘

SPIDER_MODULES = [‘firstBlood.spiders‘]
NEWSPIDER_MODULE = ‘firstBlood.spiders‘

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36‘

# Obey robots.txt rules
#默认为True ,改为False  不遵从ROBOTS协议  反爬
ROBOTSTXT_OBEY = False

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# 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‘,
#}

# Enable or disable spider middlewares
# See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    ‘firstBlood.middlewares.FirstbloodSpiderMiddleware‘: 543,
#}

# Enable or disable downloader middlewares
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    ‘firstBlood.middlewares.FirstbloodDownloaderMiddleware‘: 543,
#}

# Enable or disable extensions
# See https://doc.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    ‘scrapy.extensions.telnet.TelnetConsole‘: None,
#}

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   ‘firstBlood.pipelines.FirstbloodPipeline‘: 300,#300 为优先级
}

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://doc.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

# Enable and configure HTTP caching (disabled by default)
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = ‘httpcache‘
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = ‘scrapy.extensions.httpcache.FilesystemCacheStorage‘

原文地址:https://www.cnblogs.com/SunIan/p/10328276.html

时间: 2024-10-27 17:38:17

爬虫--使用scrapy爬取糗事百科并在txt文件中持久化存储的相关文章

芝麻HTTP:Python爬虫实战之爬取糗事百科段子

首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的情况,是因为正则表达式没有匹配到的缘故. 现在,博主已经对程序进行了重新修改,代码亲测可用,包括截图和说明,之前一直在忙所以没有及时更新,望大家海涵! 更新时间:2015/8/2 糗事百科又又又又改版了,博主已经没心再去一次次匹配它了,如果大家遇到长时间运行不出结果也不报错的情况,请大家参考最新的评

爬虫二:爬取糗事百科段子

这一次我们利用BeautifulSoup进行网页的解析,方法其实跟前一次的差不多,只是这里我们爬取的是糗事百科,糗事百科有反爬机制,我们需要模拟用户来访问糗事百科网站,也就是加上头部信息headers,其实整体思路与上一篇所写爬虫的思路差不多,拿个速度可以共用. 1.首先我们在打开网页,并在网页空白处右击选择"检查"在弹出的网页里选择"Network" 2.然后按下"F5"刷新一下 3.在刷新后的页面里我们可以看到多条信息,任意选择一条信息点开

2019基于python的网络爬虫系列,爬取糗事百科

**因为糗事百科的URL改变,正则表达式也发生了改变,导致了网上许多的代码不能使用,所以写下了这一篇博客,希望对大家有所帮助,谢谢!** 废话不多说,直接上代码. 为了方便提取数据,我用的是beautifulsoup库和requests ![使用requests和bs4](https://img-blog.csdnimg.cn/20191017093920758.png) ``## 具体代码如下 ```import requestsfrom bs4 import BeautifulSoup de

scrapy 爬取糗事百科

安装scrapy conda install scrapy 创建scrapy项目 scrapy startproject qiubai 启动pycharm,发现新增加了qiubai这个目录 在spider目录下创建indexpage.py文件 编写糗百爬虫,获取首页的所有作者信息 #导入scrapy import scrapy #创建糗百爬虫类 class QiuBaiSpider(scrapy.Spider): #定义爬虫的名字 name = 'qiubai' #定义爬虫开始的URL star

python3 爬虫之爬取糗事百科

闲着没事爬个糗事百科的笑话看看 python3中用urllib.request.urlopen()打开糗事百科链接会提示以下错误 http.client.RemoteDisconnected: Remote end closed connection without response 但是打开别的链接就正常,很奇怪不知道为什么,没办法改用第三方模块requests,也可以用urllib3模块,还有一个第三方模块就是bs4(beautifulsoup4) requests模块安装和使用,这里就不说

爬虫实战 爬取糗事百科

偶然看到了一些项目,有爬取糗事百科的,我去看了下,也没什么难的 首先,先去糗事百科的https://www.qiushibaike.com/text/看一下, 先检查一下网页代码, 就会发现,需要爬取的笑话内容在一个span标签里,而且父标签是class为content的div里,那就很简单了,用select方法,先找到该文件,然获取下来并保存在txt文件里.比较枯燥. 直接贴代码吧 from bs4 import BeautifulSoup import lxml import request

爬取糗事百科的图片

小编,最近写了个单线程的爬虫,主要是爬取糗事百科的图片之类的,下面是源代码,小伙伴们可以拿去参照,学习 #!/usr/bin/env python# -*- coding:utf-8 -*-import requests,jsonimport requests,re,os,timeimport urllib.requestimport urllib.parseimport sslimport unittestfrom selenium import webdriver headers = {"U

PHP爬取糗事百科首页糗事

突然想获取一些网上的数据来玩玩,因为有SAE的MySql数据库,让它在那呆着没有什么卵用!于是就开始用PHP编写一个爬取糗事百科首页糗事的小程序,数据都保存在MySql中,岂不是很好玩! 说干就干!首先确定思路 获取HTML源码--->解析HTML--->保存到数据库 没有什么难的 1.创建PHP文件"getDataToDB.php", 2.获取指定URL的HTML源码 这里我用的是curl函数,详细内容参见PHP手册 代码为 <span style="fo

使用Python爬取糗事百科热门文章

默认情况下取糗事百科热门文章只有35页,每页20条,根据下面代码可以一次性输出所有的文章,也可以选择一次输出一条信息,回车继续.不支持图片内容的显示,显示内容包括作者,热度(觉得好笑的人越多,热度越高),内容.从热度最高开始显示到最低.实现代码如下: #!/usr/bin/python #coding:utf8 """ 爬取糗事百科热门文章 """ import urllib2 import re #模拟浏览器访问,否则无法访问 user_age