运用scrapy框架
将爬取的数据保存到数据库
学习内容:
1、掌握 python基本语法
2、运用pychrame开发环境
3、 获取数据
4、保存到数据库
学习时间:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点
学习产出:
大家好丫!我是honey,我今天想要和大家分享一下我大二实训是所搞的项目。嘿嘿就是爬取网站的数据。我想分享一下我的代码。
大家应该都知道scrapy框架吧,这个框架用来爬虫真的是绝绝子,首先在setting里面对所要运用的函数进行设置。
这里我就只贴出数据库的设置,其他该打开的我就不细说了哈,大家都会。
#数据库的相关设置 MYSQL_HOST = '127.0.0.1' MYSQL_USER = 'root' MYSQL_PASSWORD = '1234' MYSQL_DATAbase = 'liepin_job' MYSQL_TABLE_NAME = 'liepin_job' #我的use_agent
2.在items中定义所需要的参数
import scrapy
class LiepinspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
positionName = scrapy.Field() # 职位名
companyName = scrapy.Field() # 公司名
salary = scrapy.Field() # 薪资
jobMsg = scrapy.Field() # 工作信息
positionMsg = scrapy.Field() # 职位信息
address = scrapy.Field() # 工作地址
link = scrapy.Field() # 工作详情连接
3.在pipelines中写爬取网站的代码
from itemadapter import ItemAdapter
import pymysql
import re
class MysqlPipeline(object):
# from_crawler 中的参数crawler表示这个项目本身
# 通过crawler.settings.get可以读取settings.py文件中的配置信息
@classmethod
def from_crawler(cls, crawler):
cls.host = crawler.settings.get('MYSQL_HOST')
cls.user = crawler.settings.get('MYSQL_USER')
cls.password = crawler.settings.get('MYSQL_PASSWORD')
cls.database = crawler.settings.get('MYSQL_DATAbase')
cls.table_name = crawler.settings.get('MYSQL_TABLE_NAME')
return cls()
# open_spider表示在爬虫开启的时候调用此方法(如开启数据库)
def open_spider(self, spider):
# 连接数据库
# self.db = pymysql.connect(self.host, self.user, self.password, self.database, charset='utf8')
self.db = pymysql.connect(host="127.0.0.1", user="root", password="1234", database="liepin_job",charset="utf8mb4")
self.cursor = self.db.cursor()
def process_item(self, item, spider):
# 向表中插入爬取的数据 先转化成字典
data = dict(item)
table_name = self.table_name
keys = ','.join(data.keys())
values = ','.join(['%s'] * len(data))
sql = 'insert into %s (%s) values (%s)' % (table_name, keys, values)
self.cursor.execute(sql, tuple(data.values()))
self.db.commit()
return item
class GetLiepinPipeline(object):
def table_exists(self, con, table_name): # 这个函数用来判断数据表是否存在
sql = "show tables;"
con.execute(sql)
tables = [con.fetchall()]
table_list = re.findall('('.*?')', str(tables))
table_list = [re.sub("'", '', each) for each in table_list]
if table_name in table_list:
return 1
else:
return 0
class StripPipeline(object):
def process_item(self, item, job_detail):
item['jobMsg'] = ''.join([i.strip() for i in item['jobMsg']]).strip()
item['positionMsg'] = ''.join([i.replace('rn', '') for i in item['positionMsg']]).strip()
return item



