crapy 爬虫框架的使用

news/2024/12/16 12:48:38/

1.scrapy框架安装

安装前先安装python3和pycharm 社区版

执行命令安装scrapy,

pip install scrapy

2.创建项目

执行命令:

scrapy startproject test_spider

如图:

3.使用pycharm大开项目并设置pipenv虚拟机环境

虚拟环境是为了依赖隔离,打开项目,如图:

点击设置,如图:

点击add interpreter,然后选择 pipenv 环境,如图:

 

 然后选择OK,就设置成功了,如图:

4.爬取信息

在项目路径下执行命令:

scrapy genspider getjobsinfo 目标网址

如:scrapy genspider getjobsinfo 求职_找工作_招聘_2024年招聘信息-智联招聘

如图:

可以看到在spiders包下创建了一个getjobsinfo的pyhthon文件,这就是刚刚创建的爬虫

爬虫代码编写:

from scrapy import Request, Selectorclass GetjobsinfoSpider(scrapy.Spider):name = 'getjobsinfo'allowed_domains = ['zhaopin.com']# start_urls = ['https://www.zhaopin.com/']def start_requests(self):#  提交爬取路径交给引擎,开始爬取yield Request(url='https://www.zhaopin.com/')def parse(self, response, **kwargs):#  拿到响应体 使用xpath解析数据jobs_list = Selector(text=response.text).xpath("//a[@class='zp-jobNavigater__pop--href']/text()").extract()  citys_list = Selector(text=response.text).xpath( "//div[@class='footerFuncCity clearfix']/ul/li/strong/a/text()").extract()  print(jobs_list)print(citys_list)

5.重新安装scrapy

因为虚拟机的环境是隔离的,代码中找不到scrapy的库,所以要重新安装scrapy,如图:

使用命令安装,或者ide快捷安装,如图:

 

 

 6.集成selenium

selenium一个浏览器内核,可以模拟浏览器的行为,解决反爬虫的网站数据抓取。
打开middlewares.py,编辑TestSpiderDownloaderMiddleware类。修改如下内容。

实现思路:拿到响应体后,使用BeautifulSoup4解析出网页的文本,如果文本数量小于200,就使用selenium重新爬取。

先要在虚拟环境中安装BeautifulSoup4和selenium,同时将Chrome驱动放入虚拟环境下的python根目录。如图:

 驱动版本需要和安装的浏览器版本一致:
查看驱动版本:

 

下载驱动的链接地址:
CNPM Binaries Mirror
由于我的浏览器版本比较新,所有还未正式发布驱动,找了一个临时地址:
https://googlechromelabs.github.io/chrome-for-testing/

使用命令安装依赖:

pip install BeautifulSoup4
pip install selenium

修改TestSpiderDownloaderMiddleware类,导入依赖:

from bs4 import BeautifulSoup
from scrapy import signals
from scrapy.http import HtmlResponse
from selenium import webdriver
from selenium.common import TimeoutException

增加构造函数和析构函数,并且修改process_response函数:

    def __init__(self):# 在初始化方法中创建Chrome实例options = webdriver.ChromeOptions()options.add_argument('--headless')  # 设置无界面self.webdriver = webdriver.Chrome(options=options)def __del__(self):self.webdriver.close()  # 关闭窗口self.webdriver.quit()  # 关闭浏览器def process_response(self, request, response, spider):try:# 提取响应体文本pure_text = BeautifulSoup(response.body).get_text()if len(pure_text) < 200:print('Chrome driver begin...')self.webdriver.get(url=response.url)# wait = WebDriverWait(self.webdriver, timeout=20)return HtmlResponse(url=response.url, body=self.webdriver.page_source,encoding='utf-8')  # 返回selenium渲染之后的HTML数据else:return responseexcept TimeoutException:return HtmlResponse(url=response.url, encoding='utf-8', status=500)finally:print('Chrome driver end...')

如图:

中间件修改完成后在settings.py中设置使用我们修改过的中间件, 设置里默认有写,取消注释即可,TestSpiderDownloaderMiddleware是中间件的类名。
如图:

7.item接收数据

爬取到的数据需要使用item进行接收,以便进行下一步处理,在items.py中添加一个item。

class JobInfo(scrapy.Item):job_name = scrapy.Field() job_salary = scrapy.Field()  job_place = scrapy.Field()  job_experience = scrapy.Field()  job_education = scrapy.Field()  job_tag = scrapy.Field() company_name = scrapy.Field()  company_type = scrapy.Field() company_scale = scrapy.Field()  link = scrapy.Field() 

8.使用回调

这里有一个问题,下载到的页面还会使用当前的parse方法解析数据,这并不是我们所期望的,所以要在这里添加一个回调,使用其他方法解析这个Request,所以需要再写一个回调方法,使用该回调方法解析下一步的数据。

同时在该回调方法里解析数据,然后用item接收。

修改getjobsinfo.py的代码

import scrapy
from scrapy import Request, Selector
from test_spider.items import JobInfo
class GetjobsinfoSpider(scrapy.Spider):name = 'getjobsinfo'allowed_domains = ['zhaopin.com']# start_urls = ['https://www.zhaopin.com/']def start_requests(self):yield Request(url='https://www.zhaopin.com/')def parse(self, response, **kwargs):jobs_list = Selector(text=response.text).xpath("//a[@class='job-menu__sub__name']/text()").extract()  # 工作列表# citys_list = Selector(text=response.text).xpath(#     "//a[@class='city-nav__item__cities__a']/text()").extract()  # 工作地点print(jobs_list)# print(citys_list)for job in jobs_list:# for city in citys_list:#     url = f'http://sou.zhaopin.com/?jl={city}&kw={job}'#     yield Request(url=url, callback=self.jobs_parse)url = f'http://sou.zhaopin.com/?jl=成都&kw={job}'yield Request(url=url, callback=self.jobs_parse)def jobs_parse(self, response):doms = Selector(text=response.text).xpath("//*[@id='positionList-hook']/div/div[@class='joblist-box__item clearfix']").extract()for dom in doms:## 数据解析过程job_name = Selector(text=dom).xpath("//span[@class='iteminfo__line1__jobname__name']/@title").extract_first()job_salary = Selector(text=dom).xpath("//p[@class='iteminfo__line2__jobdesc__salary']/text()").extract_first()job_place = Selector(text=dom).xpath("//ul[@class='iteminfo__line2__jobdesc__demand']/li[1]/text()").extract_first()job_experience = Selector(text=dom).xpath("//ul[@class='iteminfo__line2__jobdesc__demand']/li[2]/text()").extract_first()job_education = Selector(text=dom).xpath("//ul[@class='iteminfo__line2__jobdesc__demand']/li[3]/text()").extract_first()job_tag = Selector(text=dom).xpath("//div[@class='iteminfo__line3__welfare']/div/text()").extract()company_name = Selector(text=dom).xpath("//span[@class='iteminfo__line1__compname__name']/@title").extract_first()company_type = Selector(text=dom).xpath("//div[@class='iteminfo__line2__compdesc']/span[1]/text()").extract_first()company_scale = Selector(text=dom).xpath("//div[@class='iteminfo__line2__compdesc']/span[2]/text()").extract_first()link = Selector(text=dom).xpath("//a[@class='joblist-box__iteminfo iteminfo']/@href").extract_first()##  数据持久化job_info = JobInfo()job_info['job_name'] = job_namejob_info['job_salary'] = job_salaryjob_info['job_place'] = job_placejob_info['job_experience'] = job_experiencejob_info['job_education'] = job_educationjob_info['job_tag'] = job_tagjob_info['company_name'] = company_namejob_info['company_type'] = company_typejob_info['company_scale'] = company_scalejob_info['link'] = link# 将数据提交yield job_info

9.数据持久化

使用peewee持久化数据,在管道进行处理.

9.1安装peewee

命令:

pip install peewee

创建一个Model.py编写代码如下

from peewee import *db = MySQLDatabase('wsx',host="192.168.0.95", ## 主机地址port=3306,  # 端口 默认3306user="root", ## 用户名password="meimima") ## 密码class DataModel(Model):class Meta:database = dbclass JobsInfo(DataModel):  #job_name = CharField(max_length="255")job_salary = CharField(max_length="255")job_place = CharField(max_length="255")job_experience = CharField(max_length="255")job_education = CharField(max_length="255")job_tag = TextField(default="")company_name = CharField(max_length="255")company_type = CharField(max_length="255")## default表示默认,verbose_name表示字段描述company_scale = CharField(max_length="255", default="", verbose_name="")link = TextField(default="", verbose_name="")db.create_tables([JobsInfo])

9.2编辑管道文件

打开piplines.py,编辑如下信息

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterfrom test_spider.spiders.Model import JobsInfoclass TestSpiderPipeline:def __init__(self):passdef close_spider(self, spider):pass# 处理提交的itemdef process_item(self, item, spider):try:job_info = JobsInfo()job_info.job_name = item['job_name']job_info.job_salary = item['job_salary']job_info.job_place = item['job_place']job_info.job_experience = item['job_experience']job_info.job_education = item['job_education']job_info.job_tag = item['job_tag']job_info.company_name = item['company_name']job_info.company_type = item['company_type']job_info.company_scale = item['company_scale']job_info.link = item['link']job_info.save()print(f"{item['job_name']}保存成功")except (IndexError, TypeError, TimeoutError):print("保存失败")

整个项目结构,如图:

9.3最后在settings.py下启动这个管道。

大功告成!!!!

打开python控制台,输入scrapy crawl getjobsinfo启动我们的爬虫

如果出现报错,如图:

表示mysql驱动没有安装:
命令安装:

pip install pymysql

如果出现:[scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt:这样的错误,如图:

修改settings.py文件,ROBOTSTXT_OBEY = False ,如图:

安装完成之后,再次执行:

就可以看到数据了:

 10.调试

有可能会遇到抓不到数据,这时候就需要调试,这里提供pycharm工具的调试方式。

10.1 创建run.py文件

在settings.py的同级目录创建一个run.py文件,内容如下:


from scrapy import cmdlinename = 'getjobsinfo'
cmd = 'scrapy crawl {0}'.format(name)
cmdline.execute(cmd.split())

如图:

然后在你需要调试的地方打赏断点,然后右键run.py文件,选择run debug,如图:

运行之后,断点就会打到这里,如图:


http://www.ppmy.cn/news/1555589.html

相关文章

《C 语言携手 PaddlePaddle C++ API:开启深度学习开发新征程》

在深度学习领域&#xff0c;PaddlePaddle 作为一款强大的深度学习框架&#xff0c;为开发者提供了丰富的功能和高效的计算能力。而 C 语言&#xff0c;凭借其高效性和广泛的应用场景&#xff0c;与 PaddlePaddle 的 C API 相结合&#xff0c;能够为深度学习开发带来独特的优势。…

Https身份鉴权(小迪网络安全笔记~

附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;若有错误欢迎指正&#xff01; 5.2 Https&身份鉴权 引子&#xff1a;上一篇主要对Http数据包结构、内容做了介绍&#xff0c;本篇则聊聊Https、身份鉴权等技术。 …

基于 Couchbase 数据仓库元数据管理的可行性方案

在大数据体系中&#xff0c;元数据管理是数据治理的关键一环。以下是一套元数据管理的可行性方案&#xff0c;适合你的当前架构设计&#xff08;基于 Couchbase 数据仓库&#xff09;并支持高效管理数据的分层与结构。 1. 元数据管理的目标 统一数据管理&#xff1a;清晰描述 …

【k8s源码】kubernetes-1.22.3\staging 目录作用

文章目录 Kubernetes 中 staging 目录的作用1. 什么是 staging 目录&#xff1f;2. 为什么需要 staging 目录&#xff1f;背景问题解决方法 3. staging 目录的作用3.1 模块化开发3.2 管理跨模块依赖3.3 发布和版本化 4. staging 的工作原理4.1 源码结构4.2 构建过程4.3 模块发布…

Color-Light-Control-and-Four-Way-Responder based on STM32F103C8T6

Light Control and Responder 若要实现同样效果请看源码: gitee.com/apollo_666/Color-Light-Control-and-Four-Way-Responder # Abstract The design project for a decorative lighting controller enhanced our practical skills and engineering capabilities. During our…

24秋:模式识别:填空解答题

​ 目录 一.空题目 二.解答题目 一.空题目 9&#xff1a;已知样本集合为&#xff1a;([3,4],1),([2,5],2),([8,10],3),([7,8],4),([6,9],5)&#xff0c;请计算样本数据部分的均值______ 10&#xff1a;当样本数较小时&#xff0c;为什么最小化经验风险会带来过拟合问题&…

SmartDV将SDIO系列IP授权给RANiX开发车联网(V2X)产品

双方的合作将增强符合ISO 26262标准的车联网&#xff08;V2X&#xff09;系统的通信和连接能力&#xff0c;加速实现更安全、更智能的汽车系统和车辆创新 加利福尼亚州圣何塞市&#xff0c;2024年12月——灵活、高度可配置、可定制化的半导体设计知识产权&#xff08;IP&#…

嵌入式电机驱动开发

目录 一、嵌入式电机驱动开发概述 &#xff08;一&#xff09;嵌入式系统与电机驱动开发的关联 &#xff08;二&#xff09;常见应用领域举例 二、嵌入式电机驱动开发的关键技术要点 &#xff08;一&#xff09;硬件相关要点 1. 微控制器选型与配置 2. 电机驱动器选型及…