Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?
前言 这个文章的技术含量并不高,旨在练习scrapy框架的基本用法,熟悉框架下各个文件的作用。 先上一波爬取结果: 进群:125240963 ? 即可获取数十套PDF哦! 日志部分截图 数据库部分截图 实战 引入类库 import scrapy from urllib import parse from pymongo import MongoClient 创建项目 #有虚拟环境的可以先切换到对应的虚拟环境下 #创建scrapy项目 scrapy startproject hrspider #创建scrapy爬虫 scrapy genspider hr https://hr.tencent.com/position.php 分析页面,编写代码 分析请求页面 根据上面的分析我们可以很方便的得到下面的代码: class HrspiderSpider(scrapy.Spider): name = 'hrspider' allowed_domains = ['tencent.com'] start_urls = ['https://hr.tencent.com/position.php'] def parse(self,response): pass 查看页面上我们需要提取的元素,编写对应的xpath路径便于提取数据。代码如下: def parse(self,response): tr_list = response.xpath("//table[@class='tablelist']/tr")[1:-1] for tr in tr_list: item = TencenthrItem() item["title"] = tr.xpath("./td[1]/a/text()").extract_first() item["position"] = tr.xpath("./td[2]/text()").extract_first() item["num"] = tr.xpath("./td[3]/text()").extract_first() item["location"] = tr.xpath("./td[4]/text()").extract_first() item["publish_date"] = tr.xpath("./td[5]/text()").extract_first() url = tr.xpath("./td[1]/a/@href").extract_first() item["detail_url"] = parse.urljoin(response.url,url) print(item) 成功提取单个页面的元素之后,我们需要不断获取下一页的地址,以便于获取全部的数据,页面分析如下: 翻页分析 根据上图的分析逻辑,我们可以得到完善parse方法的代码: def parse(self,url) print(item) yield scrapy.Request( item["detail_url"], callback=self.parse_detail, meta={"item": item} ) next_url = response.xpath("//a[@id='next']/@href").extract_first() if next_url != "javascript:;": next_url = "http://hr.tencent.com/" +next_url print(next_url) yield scrapy.Request( next_url, callback=self.parse ) 接下来获取详情页的岗位职责和要求,同样我们分析详情页面,如下: 详情页分析 我们可以很直接就能找到我们需要的信息,只需要编写对应的xpath,所以获取详情页的代码如下: # 处理详情页 def parse_detail(self,response): item = response.meta["item"] job_intrs = response.xpath("//table[@class='tablelist textl']/tr[3]/td/ul/li/text()").extract() if job_intrs: item["job_intr"] = ",".join(job_intrs) else: item["job_intr"] ="无" job_resps = response.xpath("//table[@class='tablelist textl']/tr[4]/td/ul/li/text()").extract() if job_resps: item["job_resp"] = ",".join(job_resps) else: item["job_resp"] = "无" print(item) yield item 到这里,我们就已经基本完成了这个网站的爬取,同时为了完成对数据的存储,我们需要在pipline.py中编写相关的数据库存储代码: client = MongoClient() collection = client["tencent"]["hr"] class TencenthrPipeline(object): def process_item(self,item,spider): if isinstance(item,TencenthrItem): print(item) collection.insert(dict(item)) return item 总结 什么时候需要构建多个piplines?
在scrapy项目中如何构造请求? 使用scrapy.Request()方法,其中常用参数有三个:
为什么要定义item?
如何使用scrapy shell? #切换到项目目录下 scrapy shell [url地址] #默认进入python交互环境,安装Ipython的情况下默认进入Ipython #可以在命令行环境下测试xpath的有效性 response.xpath('xxxxxx') 如何在pycharm中调试运行scrapy项目? 在项目下新建main.py文件,在文件中输入以下代码,即可 from scrapy.cmdline import execute import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) execute(['scrapy','crawl','hrspider']) 注意:这段代码的含义和我们在cmd窗口下输入的结果是相同的,我们这里不过使用的是scrapy.cmdline中的execute将我们要输入带cmd中的命令在这里拼接到一起而已。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |