第一步创建project,已天涯网为例,抓取天涯网中的邮箱。
终端上输入命令,1,scrapy startproject tianya,2,cd tianya,3,scrapy genspider mytianya bbs.tianya.com
然后在mytainya.py文件中代码如下:
import scrapy
import re
from tianya import items
name = 'mytianya' # 爬虫名
allowed_domains = ['tianya.com'] # 允许爬取的域名
start_urls = ['http://bbs.tianya.cn/post-140-393968-1.shtml'] # 列表,可以多个,开始url
# 主要逻辑
# 清洗过程
def parse(self, response):
html = response.body.decode('utf-8')
# dizi@sina.com.cn
# 邮箱正则
emailre = "[a-z0-9_]+@[a-z0-9]+\.[a-z]{2,4}"
emailList = re.findall(emailre, html, re.I) # 忽略大小写
# print(emailList)
# 实例化item 导入items.py文件中的类
# item = items.TianyaItem()
# item['email'] = emailList
#
# return item # 全部一起返回,不会经过pipeline
# 去重操作需要用到pipelines,在setting.py文件中打开这个命令,ITEM_PIPELINES = {
# 'tianya.pipelines.TianyaPipeline': 300, # 优先级1-1000之内,数字越小,优先级越高
#}
# 存储过了,就不会存第二次
for email in emailList:
item = items.TianyaItem()
item['email'] = email
yield item
然后items.py文件代码如下:
import scrapy
class TianyaItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 抓取字段
email = scrapy.Field() # 邮箱
最后保存数据,在终端输入命令:scrapy crawl mytianya -o mytainya.json
可以保存多种数据类型:json,xml,csv,pickle等数据格式
如果想保存TXT格式,需要在pipelines.py文件中进行代码操作,如下演示:
class TianyaPipeline(object):
def __init__(self):
self.f = None
# 开启爬虫时调用
def open_spider(self, spider): #open_spider函数方法是继承object类中的方法,所以写死了,只能是open_spider
self.f = open("mytianya.txt", 'a+', encoding='utf-8', errors='ignore')
# 存储到mytianya.txt的文档中,a+方式如果文件不存在则创建。
def process_item(self, item, spider):
self.f.write(item["email"] + '\n')
return item # 一定要,不能删除。
# 关闭爬虫
def close_spider(self, spider):
self.f.close()
def __del__(self):
pass
如果想保存进数据库中则代码需要在pipelines.py文件中进行代码操作,如下演示:
import pymysql
class TianyaPipeline(object):
def __init__(self):
self.conn = None
self.cousor = None
def open_spider(self, spider):#open_spider函数方法是继承object类中的方法,所以写死了,只能是open_spider
# 连接
self.conn = pymysql.connect(host='127.0.0.1', user='root', password="123456",
database='fate', port=3306,
charset='utf8')
#创建 游标
self.cousor = self.conn.cursor()
def process_item(self, item, spider):
sql = "insert into tianya(email) VALUES (%r)" % \
(item['email'])
self.cousor.execute(sql)self.conn.commit()
return item
def close_spider(self, spider):
self.cousor.close()
self.conn.close()