最近更新文章比较克制,因为做公众号有自己的价值观「每次更新尽量给读者提供价值而不是消费读者」公众号立足于原创,内容尽量做到系统化,结构化,立体化,旨在让读者能直接能过我的教程来循序渐进的去提升自己。
之前我们讲到了使用Scrapy,今天我们使用Scrapy来作一个项目实战。Scrapy详细教程可以看前面两篇:
爬虫篇 | 高级爬虫(一):Scrapy爬虫框架的安装 爬虫篇 | 高级爬虫( 二):Scrapy爬虫框架初探
今天我们是用Scrapy来爬取拉勾网的Python招聘信息。 这个项目刚刚在我的知识星球与球友们已经做过了!这里拿出来总结一下。
直接搜索Python职位:
https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=
爬取拉钩数据的办法有人使用了post发送数据请求,结果总是提示操作太频繁,我没有采用这种方式.
直接选Python模块,发现数据是有规律的: https://www.lagou.com/zhaopin/Python/2/?filterOption=3 https://www.lagou.com/zhaopin/Python/3/?filterOption=3
方式一直接通过发起Post请求,然后得到json数据,然后解析数据。但这种方式比较容易被封ip,总是提示操作太频繁,从而爬取不到正确的数据。可以登录设置Cookie,然后能访问到一些数据,但不是很全,我最终没有使用这种方式,也许有其它的朋友有解决办法,也希望能与我探讨一下。
方式二是发起Get请求,然后用xpath解析字段来获取数据,这种办法比较笨,但至少我们能把数据完整的采集出来,而我今天也是说的这种方式。
scrapy startproject lagouSpider
「前提是你已经安装好了Scrapy环境」,创建项目完毕后可以进行下一步。lagouSpider
文件夹中的spiders
文件夹中创建爬取数据的文件,这里是入口。class lagou_crawl(scrapy.Spider):
name = "lagou" # 这个命名是待会我们启动爬虫的名字,是唯一的!
allowed_domains = ['lagou.com'] #这个是我们爬取的站点,
start_urls = [
'https://www.lagou.com/zhaopin/Python/{}/?filterOption=3'.format(i) for i in range(1, 31)
] # 这里是我们开始爬取的网站
def parse(self, response):
lagouSpider
文件夹中的items
文件中存储自己爬取的字段。
```Python
class LagouspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
job_title = scrapy.Field()
job_address = scrapy.Field()
job_money = scrapy.Field()
job_company = scrapy.Field()
job_fintance = scrapy.Field()
pass
```
lagouSpider
文件夹中的pipelines
文件中写入数据到数据中。这里需要注意把settings
文件中的 ITEM_PIPELINES
注释去掉。class LagouspiderPipeline(object):
def __init__(self):
self.db = DBTool()
def process_item(self, item, spider):
job_title = item['job_title']
job_address = item['job_address']
job_money = item['job_money']
job_company = item['job_company']
job_fintance = item['job_fintance']
sql = "insert into lagou_data(`title`,`address`,`money`,`company`,`fintance`) values('{}','{}','{}','{}','{}')".format(job_title,job_address,job_money,job_company,job_fintance)
print('--------------------{}'.format(sql)) # 这里一定要打印sql来看看sql是否正确,
self.db.inset_data(sql)
return item
# Mysql数据库的配置信息
MYSQL_HOST = '192.168.1.250'
MYSQL_DBNAME = 'crawler_data' # 数据库名字,请修改
MYSQL_USER = 'root' # 数据库账号,请修改
MYSQL_PASSWD = '123456' # 数据库密码,请修改
MYSQL_PORT = 3306 # 数据库端口,在dbhelper中使用
以上几步弄好后,我们开始运行我们的项目了
在我们刚才创建的项目文件夹运行我们的项目。打比方我们的项目路径是: G:\scrapy_project\lagouSpider
那么我们应该在这个lagouSpider文件夹下运行命令行 scrapy crawl lagou
这个lagou
是我们刚才创建爬虫入口文件的name。
如果运行顺利的话,可以得到数据。效果图如下。
项目源码地址:https://github.com/pythonchannel/lagouSpider
好了数据是爬出来了,但发现爬取的时候,获取数据比较慢,这是因为拉勾反爬机制是比较厉害的,我故意把settings文件中 DOWNLOAD_DELAY
时间改长了,如果时间比较短很容易被反爬虫数据获取得就不够完整,如何更快爬取数据,这是我要做的下一个课题!貌似加上cookie池与挂上代理ip,可以完美解决这个问题!