Spider学习笔记(十):一个Scrapy框架实战操作

爬取目标:爬取某论坛评论中的所有邮箱

首先,创建Scrapy工程和项目

在cmd命令中输入如下命令:

scrapy startproject tianya(工程名)

scrapy genspider mytianya  "bbs.tianya.cn"(生成mytianya.py文件)(爬取的域名范围)

在工程目录下生成一个start.py文件,方便程序的运行,并编写一下内容在文件中

import scrapy.cmdline

scrapy.cmdline.execute(['scrapy','crawl','mytianya'])

使用效果等同于在cmd中输入命令:

在items.py文件中创建爬取目标,代码如下

import scrapy


class TianyaItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 爬取目标
    email = scrapy.Field()  # 邮箱
    pass

在mytianya.py写爬取逻辑,代码如下

import re
from tianya.items import TianyaItem
import scrapy

class MytianyaSpider(scrapy.Spider):
    name = 'mytianya'
    allowed_domains = ['bbs.tianya.cn']
    start_urls = ['http://bbs.tianya.cn/post-140-393968-1.shtml']

    def parse(self, response):
        #z邮箱正则
        emailRe = "[a-z0-9_]+@[a-z0-9]+\.[a-z]{2,4}"
        print(response.text)
        html = response.body.decode('utf-8')
        
        #获得邮箱列表
        emailList = re.findall(emailRe,html,re.I)
        print(emailList)
        
        #实例
        item = TianyaItem()
        
        item["email"] = emailList

        #返回你的存储对象
        for e in emailList:
            item["email"] = e.strip()
            yield item

在pipelines.py设计管道存储爬取内容:

class TianyaPipeline(object):

    def __init__(self):
        pass

    def open_spider(self, spider):
        '''
        爬虫开启的时候调用 一次
        :param spider:
        :return:
        '''

        self.f = open('tianya.txt', 'w', encoding='utf-8', errors='ignore')

    # 持久化
    def process_item(self, item, spider):
        '''
        写入txt
        :param item: 存储对象
        :param spider: 爬虫名
        :return:
        '''

        # with open("tianya.txt", 'a+', encoding='utf-8', errors='ignore') as f:
        #     f.write(item['email'])

        self.f.write(item['email'] + '\n')

        # 被处理过的item,下次我就不存了
        # 一定要有
        return item

    def close_spider(self, spider):
        '''
        爬虫关闭的时候 一次
        :param spider:
        :return:
        '''

        self.f.close()

    def __del__(self):
        pass

储存效果:

scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,,命令如下:

```
scrapy crawl mytianya -o mytianya.json

scrapy crawl mytianya -o mytianya.csv

scrapy crawl mytianya -o mytianya.xml

猜你喜欢

转载自blog.csdn.net/xiaohuoche175/article/details/81950885