前言
这个文章的技术含量并不高,旨在练习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()方法,其中常用参数有三个:
callback:表示当前请求的url响应交给哪个函数处理 Meta:实现不同解析函数之间传递数据 dont_filter:scrapy默认会过滤URL地址即请求过的地址不会再请求,对于url响应会变的请求,可以使用该参数反复抓取该地址。为什么要定义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中的命令在这里拼接到一起而已。
总结以上是内存溢出为你收集整理的Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?全部内容,希望文章能够帮你解决Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)