爬取目标:爬取某论坛评论中的所有邮箱
首先,创建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