python爬虫scrapy项目详解(关注、持续更新)
python爬虫scrapy项目(一)
爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&start)
爬取内容:职位;职位类型;招聘人数;工作地点;发布时间;招聘详细链接;工作职责;工作要求
反反爬措施:设置随机user-agent、设置请求延时操作、
1、开始创建项目
1 scrapy startproject tencent
2、进入tencent文件夹,执行启动spider爬虫文件代码,编写爬虫文件。
1 scrapy genspider hr "tencent.com"
命令执行完,用Python最好的IDE---pycharm打开该文件目录,会在你的当前目录创建如下文件目录。
3、编写该目录下的items.py文件,设置你需要爬取的字段。
1 class TencentItem(scrapy.Item): 2 # define the fields for your item here like: 3 # 职位 4 position = scrapy.Field() 5 # 职位类型 6 position_type = scrapy.Field() 7 # 招聘人数 8 persons = scrapy.Field() 9 # 工作地点 10 place = scrapy.Field() 11 # 招聘发布时间 12 time = scrapy.Field() 13 # 职位详细链接 14 detail_link = scrapy.Field() 15 # 工作职责 16 work_duty = scrapy.Field() 17 # 工作要求 18 work_request = scrapy.Field()
4、进入spiders文件夹,打开hr.py文件,开始编写爬虫文件
1 # -*- coding: utf-8 -*- 2 import scrapy 3 import re 4 from items import TencentItem 5 6 class HrSpider(scrapy.Spider): 7 name = 'hr' 8 allowed_domains = ['tencent.com'] 9 offset = 0 10 original_url = 'https://hr.tencent.com/position.php?keywords=&tid=0&start=' 11 # 设置动态起始url 12 start_urls = ['https://hr.tencent.com/position.php?keywords=&tid=0&start=' + str(offset)] 13 14 def parse(self, response): 15 # 编写xpath规则提取需要的数据,进行数据清洗。 16 trs = response.xpath("//table[@class='tablelist']//tr")[1:-1] 17 for tr in trs: 18 item = TencentItem() 19 item["position"] = tr.xpath("./td[1]/a/text()").extract() 20 item["position_type"] = tr.xpath("./td[2]/text()").extract() 21 item["persons"] = tr.xpath("./td[3]/text()").extract() 22 item["place"] = tr.xpath("./td[4]/text()").extract() 23 item["time"] = tr.xpath("./td[5]/text()").extract() 24 link_part = tr.xpath("./td[1]/a/@href").extract_first() 25 # 分析网址结构,拼接正确的职位详细链接 26 url_detail = item["detail_link"] = 'https://hr.tencent.com/' + link_part 27 # 将找到的详细链接yield 到scrapy的调度器,调度器进行入队列,依次发送请求。 28 yield scrapy.Request(url=url_detail, 29 callback=self.parse_next_url,#编写处理链接的回调函数 30 meta = {"item":item}, 31 ) 32 # 进行翻页操作 33 if self.offset < 2870: 34 self.offset += 10 35 url_send = self.original_url + str(self.offset) 36 yield scrapy.Request( 37 url=url_send, 38 callback=self.parse, 39 ) 40 # 编写回调函数 41 def parse_next_url(self,response): 42 item = response.meta["item"] 43 item["work_duty"] = response.xpath("//table[@class='tablelist textl']//tr[3]//ul//text()").extract() 44 item["work_request"] = response.xpath("//table[@class='tablelist textl']//tr[4]//ul//text()").extract() 45 item["work_duty"] = re.sub(r'(\xa0)','',str(item["work_duty"])) 46 item["work_request"] = re.sub(r'(\xa0)','',str(item["work_request"])) 47 yield item
5、编写pipeline.py文件,处理接收到的数据
1 import json 2 3 4 class TencentPipeline(object): 5 # 自定义一个打开文件,写入文件的方式存储数据 6 def __init__(self): 7 self.f = open("tencent.json","wb") 8 9 def process_item(self, item, spider): 10 # 当item文件中有中文时,ensure默认是用ascii编码中文 11 content = json.dumps(dict(item),ensure_ascii= False) + ", \n" 12 self.f.write(content.encode("utf-8")) 13 return item 14 15 def close_file(self): 16 self.f.close()
6、设置setting.py文件,配置scrapy运行的相关内容
DOWNLOADER_MIDDLEWARES = { 'tencent.middlewares.RandomUA': 543, } ITEM_PIPELINES = { 'tencent.pipelines.TencentPipeline': 300, # 'scrapy_redis.pipelines.RedisPipeline': 400, } USER_AGENT = [ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1", "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24" ]
# 设置请求延时操作
DOWNLOAD_DELAY = 1
7、设置middlewares.py文件,对请求进行处理。
class RandomUA(object): # 设置随机请求头 def process_request(self,request,spider): UA = random.choice(USER_AGENT) request.headers["user-agent"] = UA
8、设置爬虫的启动文件start.py
1 from scrapy.cmdline import execute 2 execute("scrapy crawl hr".split())
9、执行效果如下。(保存为json数据格式的字符串到本地)
1 {"position": ["25928-高级图形开发工程师(深圳总部)"], "position_type": ["技术类"], "persons": ["3"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46479&keywords=&tid=0&lid=0", "work_duty": "['负责游戏引擎图形相关特性的开发;', '负责渲染流程和算法的优化,以及相关工具的开发;', '负责图形兼容性分析以及疑难问题的分析定位工作。']", "work_request": "['本科以上学历,精通C/C++,具备扎实的数据结构和算法基础,熟悉常用设计模式;', '具备计算机图形学知识,熟练掌握3D图形渲染技术,熟悉OpenGL以及Shader开发;', '熟练掌握3D游戏引擎架构, 熟悉3D引擎的接口和游戏制作流程;', '3年以上3D引擎(Unreal、Unity等)开发经验,一年以上渲染相关开发和优化经验;', '深刻理解客户端框架和其他核心模块的实现,有主导过核心模块的开发经验者优先;', '熟悉移动端GPU/CPU架构,有移动端渲染开发经验者优先;', '责任心强,善于沟通,对游戏前沿技术应用抱有热情。']"}, 2 {"position": ["25667-渠道销售经理(深圳)"], "position_type": ["市场类"], "persons": ["2"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46485&keywords=&tid=0&lid=0", "work_duty": "['担任腾讯云渠道经理,负责区域渠道体系建设及产品销售;', '定期拜访渠道合作伙伴,充分了解客户需求并积极跟进,制定合理方案,负责方案提示、谈判,追踪公司相关部门的工作,保证方案的有效实施;', '维持与现有合作伙伴的良好业务关系,及时更新公司产品信息,传达企业及品牌文化。']", "work_request": "['本科及以上学历,计算机、电信、市场营销或其它相关专业;', '软件或互联网行业五年以上相关工作经验;', '具有丰富的渠道销售、区域管理及长尾中小企业客户覆盖经验;', '具有企业级应用软件销售经验,具有云计算及互联网行业渠道销售经验优先;', '能够有效通过渠道覆盖中长尾客户,承担区域销售业绩;', '能够建立区域渠道体系,有效处理渠道冲突与风险防范;', '能够主导制定各种服务与激励方式,持续提高渠道合作伙伴的满意度;', '具有出色的协调能力,良好的团队合作精神;为人诚信,工作敬业,有责任心。']"}, 3 {"position": ["28481-医疗健康UI开发工程师(深圳)"], "position_type": ["设计类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46476&keywords=&tid=0&lid=0", "work_duty": "['负责腾讯觅影,智慧医院等相关医疗产品的前端组件的编写,web开发工作;', '根据产品与设计要求,不断优化前端架构,改善用户体验。参与相关UI组件体系的建立、维护等。']", "work_request": "['网页重构或web前端开发工作2年以上; ', '精通HTML5,CSS3,JavaScript构建高性能web应用;掌握React或Vue并有相关实战经验,掌握主流前端构建工具grunt,gulp,webpack;', '精通UI组件化开发、动效开发、响应式、多终端适配、无障碍有一定开发经验;', '有node.js/vue/react开发经验者优先,有前端性能、工具研发方面的实践经验优先。', '对Web性能、安全相关有一定的了解; ', '有创新精神并能积极学习业界新技术,顺畅的沟通合作能力。']"}, 4 {"position": ["SA-腾讯社交广告高级系统测试工程师(研发中心 北京)"], "position_type": ["技术类"], "persons": ["1"], "place": ["北京"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46486&keywords=&tid=0&lid=0", "work_duty": "['参与互联网软件产品测试的全流程,包括参与需求分析、设计评审,制定测试计划,设计和执行测试用例,进行缺陷跟踪和软件质量分析等;', '制定测试计划,构建测试环境,执行集成测试,回归测试等; ', '保证被测系统的质量,并通过测试流程和方法创新,努力提升研发的质量和效率。']", "work_request": "['工科、计算机或其他相关专业本科以上学历;', '熟悉C/C++/Java等至少一种编程语言,有Shell或Ruby/PHP/Perl/Python等使用经验者优先;', '至少1年以上软件开发、自动化测试工作经验;', '有性能、安全、白盒测试等专业测试领域经验者优先;', '具备互联网广告、搜索、大数据处理、分布式系统、数据库和网络等业务领域测试经验者优先; ', '熟悉Linux或Unix操作系统;', '精通测试流程和测试用例设计方法,能主动进行技术钻研;', '解决复杂问题和编写自动测试工具和系统的能力;', '很强的逻辑思维能力,谈判的能力和冲突管理的能力;', '善于团队合作,理解和适应变化,以结果和行动为准则,努力追求成功。']"}, 5 {"position": ["25664-政府行业交付项目经理"], "position_type": ["产品/项目类"], "persons": ["2"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46484&keywords=&tid=0&lid=0", "work_duty": "['1、负责腾讯云政府行业的项目交付管理工作;', '2、负责项目资源的组织与协调,确保项目团队各干系人及内外部合作团队的协同工作; ', '3、负责项目计划的制定、跟踪与维护,确保项目按计划完成,并解决交付中的各类问题;', '4、协助收集客户需求和用户反馈,驱动研发团队完善产品,确保项目顺利通过验收。']", "work_request": "['1、全日制统招本科及以上学历,5年以上政府行业经验,至少深入参与5个政府行业大中型项目;', '2、有在大型企业工作的经历,管理过20人以上的项目团队,有丰富的跨部门、跨组织沟通协调经验,能够应对复杂的项目环境;', '3、熟悉研发过程,包括产品设计、需求分析、架构设计、开发、测试、运维等,熟悉敏捷开发过程;', '4、有出色的沟通能力和技巧,能够想方设法推动项目的顺利进行,有强烈的结果导向意识;', '5、具备良好的项目管理、客户关系维护能力,和优秀的沟通技巧,能妥善协调好客户、合作伙伴、内部团队的合作关系;', '6、有非常强的事业心、责任感和担当精神,有较强的抗压能力,能并行处理多个项目工作,能承受一定程度的出差或驻场工作;', '7、有PMP、ITIL证书者优先,信息产业部系统集成项目经理证书者优先。']"}, 6 {"position": ["PCG14-应用宝数据挖掘算法工程师(深圳)"], "position_type": ["技术类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46483&keywords=&tid=0&lid=0", "work_duty": "['负责提供合适的推荐算法模型;', '负责研究业内领先的技术,结合腾讯各个业务平台的数据,根据应用中心和社交渠道这两个场景给出具体的实验数据,并且评估结果;', '负责根据不同的算法模型,上报业务需要的统计数据,协助各种算法的实施;', '研究已有算法的瓶颈,提出合理的改进措施和解决方案。']", "work_request": "['计算机、应用数学、人工智能、模式识别、统计、自控等专业的硕士或者博士优先;', '2年以上相关工作经验;', '对机器学习、数据挖掘算法及其在互联网上的应用有比较深入的理解;', '熟悉掌握C/C++语言;', '有大规模分布式计算平台的使用和并行算法开发经验;', '严密的数学思维、突出的分析和归纳能力、优秀的沟通表达能力;', '有互联网广告,电商,搜索等方面推荐经验优先。']"}, 7 {"position": ["19867-游戏后台开发工程师(深圳)"], "position_type": ["技术类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46482&keywords=&tid=0&lid=0", "work_duty": "['负责游戏后台架构设计;', '负责游戏后台系统模块以及新特性开发;', '负责服务器性能优化和体验优化。']", "work_request": "['2年以上游戏服务器后台工作经验,有完整的项目经验;', '扎实的编程基础,对高在线大并发游戏后台架构有一定认识;', '熟悉Unix/Linux操作系统下的C/C++开发;', '熟悉TCP/IP协议相关知识,熟悉网络编程,熟悉数据库;', '了解游戏服务器架构及性能优化方法;', '具备良好的分析解决问题能力,能独立承担后台逻辑系统开发工作;', '高度的责任心、良好的沟通能力和团队合作精神。']"}, 8 {"position": ["TME-全民K歌项目经理(深圳)"], "position_type": ["产品/项目类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46478&keywords=&tid=0&lid=0", "work_duty": "['负责全民K歌版本计划制定,风险监控,过程跟踪,保障版本目标的实现;', '负责FT内目标确认,目标拆解,资源分配以及目标达成情况跟进,推动各角色协同工作;', '发现、总结、跟踪过程问题,推动团队各环节持续改进,提高效率。']", "work_request": "['本科以上学历,计算机或相关专业;', '3年以上软件项目管理经验,有互联网、软件领域技术开发经验优先;', '精通软件项目过程管理,对敏捷项目管理有实际应用经验及深刻理解;', '具有良好的执行力和责任心,能推动项目团队朝目标前进;', '具有丰富的与人沟通、交流和组织能力,出色的团队合作精神;']"}, 9 {"position": ["25928-高级语音算法工程师(上海)"], "position_type": ["技术类"], "persons": ["1"], "place": ["上海"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46477&keywords=&tid=0&lid=0", "work_duty": "['负责游戏语音算法优化;', '负责语音前沿技术研究;', '负责游戏语音现网版本算法维护升级。']", "work_request": "['本科及以上学历;', '熟悉PC/Android/iOS SDK任一平台C/C++开发,性能优化; ', '熟悉数字信号处理,数学功底扎实,熟悉MATLAB仿真; ', '熟悉语音前处理算法AEC,AGC,VAD,NS,CNG,JitterBuffer,Mix等算法;', '熟悉常见Codec,Opus/AAC/Speex等;', '有AI语音前处理经验优先;', '熟悉WebRTC,Speex,Opus等开源代码。']"}, 10 {"position": ["HY-游戏发行/运营培训生(深圳)"], "position_type": ["产品/项目类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46481&keywords=&tid=0&lid=0", "work_duty": "['游戏发行/运营培训生项目致力于培养高潜力的游戏运营人才,以满足快速增长游戏业务需求;', '项目采用定制化的培养方式,通过专班学习,名师辅导和项目实战,提升学员的产品sense、运营能力及通用素质,使学员成为优秀的游戏发行/运营人才。', '协助项目制作人与研发商共同制定运营目标和工作计划,约定的各阶段游戏优化、运营开发和运营支持工作;', '推动游戏研发商的日常沟通,密切关注研发和运营筹备进度同时提供必要协助;', '指导并支持项目组内不同职能员工的日常工作,推动合作部门的目标和工作计划制定;', '根据项目需求,制定并推广项目流程规范,确保项目有序推进;', '及时发现并跟踪解决项目问题,有效管理项目风险。']", "work_request": "['热爱并乐于体验游戏,对研发与运营有一定的了解,保持强烈的好奇心和求知欲;', '优秀的中英文读写能力;', '积极主动,能够承受高压的工作。']"}, 11 {"position": ["25928-高级图形开发工程师(上海)"], "position_type": ["技术类"], "persons": ["3"], "place": ["上海"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46480&keywords=&tid=0&lid=0", "work_duty": "['负责游戏引擎图形相关特性的开发;', '负责渲染流程和算法的优化,以及相关工具的开发;', '负责图形兼容性分析以及疑难问题的分析定位工作。']", "work_request": "['本科以上学历,精通C/C++,具备扎实的数据结构和算法基础,熟悉常用设计模式;', '具备计算机图形学知识,熟练掌握3D图形渲染技术,熟悉OpenGL以及Shader开发;', '熟练掌握3D游戏引擎架构, 熟悉3D引擎的接口和游戏制作流程;', '3年以上3D引擎(Unreal、Unity等)开发经验,一年以上渲染相关开发和优化经验;', '深刻理解客户端框架和其他核心模块的实现,有主导过核心模块的开发经验者优先;', '熟悉移动端GPU/CPU架构,有移动端渲染开发经验者优先;', '责任心强,善于沟通,对游戏前沿技术应用抱有热情。']"}, 12 {"position": ["28481-健康保险行业合作高级经理(深圳)"], "position_type": ["市场类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46474&keywords=&tid=0&lid=0", "work_duty": "['1、负责商业保险行业客户资源拓展(包括不限于保险公司、创新保险平台、行业协会等专业领域);', '2、拓展相关行业合作伙伴以及合作机构,整合公司已有产品和资源,形成场景化的创新解决方案;', '3、搜集整理健康保险行业的市场动态、政策变动等行业信息,解读反馈助推业务策略制定;', '4、整合资源,设计制定并推进商业合作方案落地,有效撬动行业资源合作。']", "work_request": "['1、全日制本科及以上学历,三年以上健康保险领域工作经验;', '2、熟悉保险行业,有健康险创新产品运营经验或创新平台运营经验; ', '3、具备良好的沟通表达能力,清晰的思维逻辑,敏锐的洞察力,较强的自驱力和执行力; ', '4、对工作有高度的责任心和激情,注重团队合作,适应频繁差旅需求。']"}, 13 {"position": ["25928-前端测试开发工程师(深圳)"], "position_type": ["技术类"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46473&keywords=&tid=0&lid=0", "work_duty": "['负责平台类软件的测试开发工作;', '负责平台组件的接口测试、单元测试工作;', '能够在关键技术上给予团队技术指引和支持;', '按时完成安排的移动端开发任务;', '负责与项目组之间的协调,推动工作,帮助项目组推动整个项目质量的提升。']", "work_request": "['本科及以上学历,计算机相关专业,开发或者测试开发出身,有软件开发的基础;', '2-3年以上软件行业或者互联网行业经验,熟悉Windows编程或Android/iOS编程;', '熟悉软件开发流程,熟悉Android/iOS环境下自动化测试技术;', '扎实的测试用例设计能力,熟悉主流自动化方法;', '具备扎实的C++、C或Object-C程序设计基础。', '有以下任意一项经验者优先:', '较强的DEBUG能力;', '有Android、iOS产品自动化测试经验。']"},
......