Scrapy框架,配置,使用

欢迎访问个人博客http://www.jkraise.top


cd xxx 项目中
scrapy genspider baidu baidu.com  爬虫名称 域名限定
scrapy crawl 爬虫名称


parse 函数进行提取数据
yield 惊醒数据返回 类型为dict


修改setting.py
67行代码


在pipelines.py
进行数据存储 



==============
==============
# scrapy 中间件

# 下载中间件
# Download
# 进行 userAgent, proxy, cookies, 伪装

# 自定义userAgent 中间件
class AnjukeUserAgent:
    USER_AGENTS_LIST = [
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
        "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
        "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
        "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
        "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
    ]

    def process_request(self, request, spider):
        cookies = {"cookie": "sessid=D2560B12-9D3F-AB2C-FF1A-D7DC09E683D0; aQQ_ajkguid=CD24F974-FABB-56B7-26CB-CFAD3C14865B; twe=2; id58=e87rkF+ku/zALRAfA0jAAg==; ajk_member_captcha=d6a18bfe82e526a4c446e141db9c68e6; wmda_new_uuid=1; wmda_uuid=6e1b12e0b1b556c783f271c994a35851; wmda_visited_projects=%3B6289197098934; 58tj_uuid=42ab4d02-9909-4572-8c15-3b1259148b5d; als=0; _ga=GA1.2.1995636023.1606725420; ctid=253; new_uv=4; xxzl_cid=7ee534fc2c6d4e87b26c9706cc38be3d; xzuid=f6b41c72-3567-4447-8031-dffa6379b329; obtain_by=2; wmda_session_id_6289197098934=1606811989818-04114484-64f9-fa1b"}

        UA = {
            'User-Agent': random.choice(AnjukeUserAgent.USER_AGENTS_LIST),
            'cookie': cookies['cookie'],

        }

        # 随机 选择userAgent
        request.headers['User-Agent'] = random.choice(AnjukeUserAgent.USER_AGENTS_LIST)
        request.headers['cookie'] = cookies['cookie']
        # request.headers=UA
        print('----下载中间件---request--')

        return None 



============
============
# pipeline 使用

# 自定义管道类

# 1. process_item(self,item,spider):
	# 管道类必有函数
	# 实现对item数据进行处理
	# 一般情况下 都会return item,如果没有return, 那么相当于将None 传递给权重低的process_item

# 2. open_spider(self,spider):
	# 在爬虫开启的时候 仅执行一次
	#  用于链接数据库,打开文件

# 3 close_spider(self,spider):
	# 在爬虫关闭的时候 仅执行一次
	#  用于关闭数据库,关闭文件

# pipeline注意点
1. 使用之前在setting.py 中开启
2. 多个管道的位置可以自定义,权重值越小越优先执行
3. pipeline中,process_item的方法必须有,否则return没法接收与处理
4. process_item 方法接受item和spider, 其中spider表示当前传递item 的spider
5. oper_spider(self, spider) 能够在爬虫开启的时候执行一次
6. close_spider(self, spider) 能够在爬虫关闭的时候执行一次
7. 上述两个方法,常用于爬虫和数据库的交互

========
========
使用redis 去重

	丢掉 数据,
	使用 raise Dropitem('此数据已在redis 中存储-------')

class Redis:
	def oper_spider(self, spider):
		self.redis_client = StrictRedis(host='localhost', port=6379, db=0)

	def close_spider:
		self.redis_client.close()

	# 对数据进行去重操作
	def process_item(self, item, spider)
		print('------Redis检查管道-------')
		# 转成json字符串
		hash_str = json.dums(item)
		# md5 加密
		md5 = hashlib.md5()
		md5.update(item.encode())
		havl = md5.hexdigest()

		# 判断redis 是否存在
		exist_flag = self.redis_client.get(havl)
		if exist_flag:
			raise DropItem('数据重复----丢弃')
		else:
			# 存入redis 
			self.redis_client.set(havl, item)
		return item


class Save_csv:
	def __init__(self, *args):
		# 拼接下载路径
		self.download_path = os.getcwd() + '/download/'
		if not os.path.exists(self.download_path):
			os.mkdir(self.download_path)

	def open_spider(self, spider):
		self.f = open(self.download + 'data.csv', 'a', encoding='utf-8')\

		# 判断文件是否存在
		if not os.exists(self.download + 'data.csv'):

			self.f.csv = csv.Dictwirter(self.f, ['表头'])
			self.f.csv.wirteheader()
			print("创建CSV文件成功-----")
		else:
			self.f.csv = csv.Dictwirter(self.f, ['表头'])
			print('打开csv文件成功')

	def close_spider(self, spider):
        # 关闭文件
        self.f.close()


    def process_item(self, item, spider):
        # 目的:存储数据到CSV中
        print ("---准备要保存数据到CSV----", item)
        item.pop('type')
        self.f_csv.writerows ([item])
        return item



'''存入mongodb'''
class SaveMongodb:
    def open_spider(self, spider):

        # 链接MongoDB数据库
        self.client = MongoClient("127.0.0.1", 27017)
        self.collection = self.client["test"]["t1"]

    def close_spider(self, spider):
        # 关闭Redis的链接
        self.client.close()

    def process_item(self, item, spider):
        self.collection.insert_many([item])
        print("-----存入mongodb成功----")
        return item





在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值