欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python爬虫scrapy项目详解(关注、持续更新)

程序员文章站 2022-04-02 22:35:45
python爬虫scrapy项目(一) 爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&start) 爬取内容:职位;职位类型;招聘人数;工作地点;发布时间;招聘详细链接;工作职责;工作要求 反反爬措施:设置 ......

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打开该文件目录,会在你的当前目录创建如下文件目录。

python爬虫scrapy项目详解(关注、持续更新)

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产品自动化测试经验。']"}, 
......