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