收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来
如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
正文
项目创建完成,让我们来看一下项目结构,执行:
tree /f
└─scrapyTest
│ scrapy.cfg # 配置文件(deploy configuration file)
│
└─scrapyTest
│ items.py # 项目中的item文件(project items definition file)
│ middlewares.py # 中间件
│ pipelines.py # 项目中的管道文件(project pipelines file)
│ settings.py # 项目中的设置文件(project settings file)
│ __init__.py
│
├─spiders # 存放爬虫的文件夹(a directory where you'll later put your spiders)
│ │ __init__.py
│ │
│ └─__pycache__
└─__pycache__
进入spiders目录,新建test_spider.py如下:
# -*- coding:utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
class tsSpride(scrapy.Spider):
name = 'test' # 爬虫的唯一名字,在项目中爬虫名字一定不能重复
# start_requests() 必须返回一个迭代的Request
def start_requests(self):
# 待爬取的URL列表
urls = ['http://www.jianshu.com/',]
# 模拟浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
for url in urls:
yield scrapy.Request(url=url, headers=headers, callback=self.parse)
# 处理每个请求的下载响应
def parse(self, response):
soup = BeautifulSoup(response.body, 'html.parser')
titles = soup.find_all('a', 'title')
for title in titles:
print(title.string)
在命令行输入
scrapy crawl test
结果如下:
上述代码Scrapy为start_requests 中的每个URL创建了scrapy.Request对象,并将 parse() 方法作为回调函数(callback)赋值给了Request(Scray中parse()为默认回调方法)。
七 Scrapy小例子
之前我们知道了Scrapy中每个文件所代表的含义,这次我们就以爬取拉勾网Python相关招聘信息来具体演示下Scrapy每个文件的用法。
我们要做的是,将拉勾网以‘Python’为关键字搜索到的招聘信息前五页爬下来,然后将其中的‘职位’、‘薪资’、‘学历要求’、‘工作地点’、‘公司名称’以及‘信息发布时间’提取出来并存储到MySQL数据库中。
(一)准备工作
我们先到拉勾网,在技术一栏中点击Python,得到如下页面:
点击下一页,观察地址栏URL的变化:
第二页的URL
https://www.lagou.com/zhaopin/Python/2/?filterOption=2
我们可以发现,页码的变化体现在URL中的两个数字上,由此,我们便可以得到我们需要爬取的5个页面的URL分别为:
urls = ['https://www.lagou.com/zhaopin/Python/1/?filterOption=1',
'https://www.lagou.com/zhaopin/Python/2/?filterOption=2',
'https://www.lagou.com/zhaopin/Python/3/?filterOption=3',
'https://www.lagou.com/zhaopin/Python/4/?filterOption=4',
'https://www.lagou.com/zhaopin/Python/5/?filterOption=5',
]
整理好需要爬取的URL后,我们来按F12打开开发者工具,找我们需要提取的信息:
可以看到需要爬取的信息都在
- 标签中没,右键复制一个li标签,整理一下格式,得到如下代码:
-
<li class="con_list_item default_list" data-index="3" data-positionid="991482" data-salary="8k-16k" data-company="昆明俊云科技有限公司" data-positionname="Python开发工程师" data-companyid="67804" data-hrid="1346958"> <div class="list_item_top"> <div class="position"> <div class="p_top"> <a class="position_link" href="//www.lagou.com/jobs/991482.html" target="_blank" data-index="3" data-lg-tj-id="8E00" data-lg-tj-no="0104" data-lg-tj-cid="991482" data-lg-tj-abt="dm-csearch-useSalarySorter|1"> <h2 style="max-width: 180px;">Python开发工程师</h2> <span class="add">[<em>昆明·盘龙区</em>]</span> <span class="format-time">1天前发布</span> </div> <div class="p_bot"> <div class="li_b_l"> <span class="money">8k-16k</span> <!--<i></i>-->经验1-3年 / 本科 </div> </div> </div> <div class="company"> <div class="company_name"> <a href="//www.lagou.com/gongsi/67804.html" target="_blank" data-lg-tj-id="8F00" data-lg-tj-no="0104" data-lg-tj-cid="67804" data-lg-tj-abt="dm-csearch-useSalarySorter|1">昆明俊云科技有限公司</a><i class="company_mark"><span>该企业已上传营业执照并通过资质验证审核</span></i> </div> <div class="industry"> 移动互联网,硬件 / 初创型(不需要融资) </div> </div> <div class="com_logo"> <a href="//www.lagou.com/gongsi/67804.html" target="_blank" data-lg-tj-id="8G00" data-lg-tj-no="0104" data-lg-tj-cid="67804" data-lg-tj-abt="dm-csearch-useSalarySorter|1">![](//www.lgstatic.com/thumbnail_120x120/i/image/M00/58/0F/Cgp3O1fSFEuAQJnSAAATSLVt79k366.jpg)</a> </div> </div> <div class="list_item_bot"> <div class="li_b_l"> <div class="li_b_r"> “福利优厚、期权奖励、五险一金、工作餐” </div> </div> </li>
可以发现,
- 标签属性中有我们需要的’职位‘、’薪资‘、’公司名称‘,而’工作地点‘、’学历要求‘和’信息发布时间‘则在下面的各个标签中,于是我们可以使用如下代码,提取各个信息(Beautiful Soup):
-
info = BeautifulSoup(response.body, 'html.parser').find('li','con_list_item default_list') info.attrs['data-positionname'], # 职位 info.attrs['data-salary'] info.find('em').get_text().split('·')[0], # 工作地点 (info.find('span', 'format-time')).string, # 发布时间 info.find('div', 'li_b_l').get_text().split('/')[-1], # 学历要求 info.attrs['data-company'], # 公司名称
(二)数据库的创建
先来建好数据库,这里使用的是MySQL数据库,建立如下:
DROP TABLE IF EXISTS `info01`; CREATE TABLE `info01` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `salary` int(255) NOT NULL, `position` varchar(255) NOT NULL, `time` varchar(255) NOT NULL, `grade` varchar(255) NOT NULL, `company` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=498 DEFAULT CHARSET=utf8;
要注意的是,其中的id属性设为自增,’salary‘属性设为int类型,方便以后进行数据分析统计。
(三)代码编写
准备工作完成了,下面开始代码部分,先到工作目录中建立工程,在命令行中:
scrapy startproject lgSpider
先编辑items.py文件,该文件是一个简单的数据收集容器,用于保存爬虫爬取的数据,类似一个字典:
# items.py # -*- coding: utf-8 -*- import scrapy class LgspiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() # 职位 position = scrapy.Field() # 工作地点 salary = scrapy.Field() # 最低薪资 company = scrapy.Field() # 公司名称 time = scrapy.Field() # 信息发布时间 grade = scrapy.Field() # 学历要求
在spiders中建立爬虫文件lg_spider.py如下:
# -*- coding:utf-8 -*- import scrapy from bs4 import BeautifulSoup class lg_spider(scrapy.Spider): name = 'lg' # 爬虫名字 def start_requests(self): # 待爬取的url地址 urls = ['https://www.lagou.com/zhaopin/Python/1/?filterOption=1', 'https://www.lagou.com/zhaopin/Python/2/?filterOption=2', 'https://www.lagou.com/zhaopin/Python/3/?filterOption=3', 'https://www.lagou.com/zhaopin/Python/4/?filterOption=4', 'https://www.lagou.com/zhaopin/Python/5/?filterOption=5', ] # 模拟浏览器的头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} for url in urls: yield scrapy.Request(url=url, headers=headers, callback=self.parse) def parse(self, response): # 使用Beautiful Soup进行分析提取 soup = BeautifulSoup(response.body, 'html.parser') for info in soup.find_all('li', 'con_list_item default_list'): # 将提取的salary字符串,只截取最少工资并转换成整数形式,如:7k-12k -> 7000 salary = info.attrs['data-salary'].split('k')[0] salary = int(salary) * 1000 # 存储爬取的信息 yield { 'title': info.attrs['data-positionname'], # 职位 'position': info.find('em').get_text().split('·')[0], # 工作地点 'salary': salary, # 最低工资 'time': (info.find('span', 'format-time')).string, # 发布时间 'grade': info.find('div', 'li_b_l').get_text().split('/')[-1], # 学历要求 'company': info.attrs['data-company'], # 公司名称 }
爬取的item被收集起来后,会被传送到pipelines中,进行一些处理,下面开始编辑pipelines.py用于将爬取的数据存入MySQL数据库,
# -*- coding: utf-8 -*- import pymysql # 数据库配置信息 db_config = { 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': '', 'db': 'lg_info', 'charset': 'utf8' } class LgspiderPipeline(object): # 获取数据库连接和游标 def __init__(self): self.connection = connection = pymysql.connect(**db_config) self.cursor = self.connection.cursor() # Pipeline必须实现的方法,对收集好的item进行一系列处理 def process_item(self, item, spider): # 存储的SQL语句 sql = 'insert into info01(title, salary, position, time, grade, company) values(%s, %s, %s, %s, %s, %s)' try: self.cursor.execute(sql, (item['title'].encode('utf-8'), item['salary'], item['position'].encode('utf-8'), item['time'].encode('utf-8'), item['grade'].encode('utf-8'), item['company'].encode('utf-8'), ) ) self.connection.commit() except pymysql.Error as e: # 若存在异常则抛出 print(e.args) return item **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)** ![img](https://img-blog.csdnimg.cn/img_convert/b43aa4bf37aabbd052aa5ff6b489da9b.png) **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!** ) self.connection.commit() except pymysql.Error as e: # 若存在异常则抛出 print(e.args) return item **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)** [外链图片转存中...(img-57B4wXPV-1713815277921)] **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**