您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

5b51 2022/1/14 8:25:01 python 字数 8748 阅读 846 来源 www.jb51.cc/python

前言 这个文章的技术含量并不高,旨在练习scrapy框架的基本用法,熟悉框架下各个文件的作用。

概述

前言

这个文章的技术含量并不高,旨在练习scrapy框架的基本用法,熟悉框架下各个文件的作用。

先上一波爬取结果:

进群:125240963   即可获取数十套PDF哦!

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

日志部分截图

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

数据库部分截图

实战

引入类库

import scrapy

from urllib import parse

from pymongo import MongoClient

创建项目

#有虚拟环境的可以先切换到对应的虚拟环境下

#创建scrapy项目

scrapy startproject hrspider

#创建scrapy爬虫

scrapy genspider hr https://hr.tencent.com/position.PHP

分析页面,编写代码

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

分析请求页面

根据上面的分析我们可以很方便的得到下面的代码

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)

成功提取单个页面的元素之后,我们需要不断获取下一页的地址,以便于获取全部的数据,页面分析如下:

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

翻页分析

根据上图的分析逻辑,我们可以得到完善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

)

接下来获取详情页的岗位职责和要求,同样我们分析详情页面,如下:

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

详情页分析

我们可以很直接就能找到我们需要的信息,只需要编写对应的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中的命令在这里拼接到一起而已。

总结

以上是编程之家为你收集整理的Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?全部内容,希望文章能够帮你解决Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶