python3使用scrapy获取数据然后保存至MySQL数据库,我上一篇写了如何爬取数据保存为csv文件,这一篇将会写如何将数据保存至数据库。

思路大都一样,我列一个思路:

1:获取腾讯招聘网。

2:筛选信息获取我们想要的。

3:将获取的信息按照规律保存至本地的txt文件。

4:读取txt文件的信息上传至MySQL数据库。

scrapy从mysql数据库读取url scrapy爬取数据存入mysql_连接数据库


(友情提示:如果有朋友不怎么看得懂路径导入,可以看看我之前写的自定义模块路径导入方法的文章)

下面我们就按照这四步来实现目的。

(声明一下,除了数据库有关的代码有注释外,其他有不懂的可以看上一篇生成csv文件的文章的注释)

呈上代码(代码很简单,只需要简单的分析就行了):

# _*_ coding:utf-8 _*_
import scrapy         #下面这些都是基本的模块,慢慢分析就行
from scrapy.http import Request
from time import sleep
import pymysql     #python3连接数据库的模块pymysql
import os
import sys
sys.path.append("D:\PYscrapy\get_Field")   #一样的路径导入以便调用下面两个模块
from get_Field.items import GetItem
import main

class Tencentzhaopin(scrapy.Spider):
	name = "field"
	start_urls = ["http://hr.tencent.com/position.php?&start=0#a"]
	url = "http://hr.tencent.com/"
	count = 0
	filename = "data.txt"
	if os.path.exists(filename) == True:
		os.remove(filename)

	def database(self,path):    #调用这个自定义函数来实现对数据库的操作
		connect = pymysql.connect(
			user = "root",
			password = "xxxxxxxx",  #连接数据库,不会的可以看我之前写的连接数据库的文章
			port = 3306,
			host = "127.0.0.1",
			db = "MYSQL",
			charset = "utf8"
			)
		con = connect.cursor()  #获取游标
		con.execute("create database w_tencent")  #创建数据库,!!!!这一条代码仅限第一次使用,有了数据库后就不用再使用了
		con.execute("use w_tencent")   #使用数据库
		con.execute("drop table if exists t_zhaopin")  #判断是否存在这个数据库表
		sql = '''create table t_zhaopin(name varchar(40),genre varchar(20),number bigint,place varchar(40),time varchar(20))'''
		con.execute(sql)  #执行sql命令  创建t_zhaopin表来保存信息
		with open(path,"r") as f:  #打开path本地文档
			while True:
				info = f.readline()   #一行一行的读取文档信息
				if info:
					info = info.strip()  #去掉换行符
					info = info.split(";")  #以;来分割将信息变换为列表形式
					name = info[0]
					genre = info[1]
					number = info[2]
					place = info[3]
					time = info[4]
					con.execute("insert into t_zhaopin(name,genre,number,place,time)values(%s,%s,%s,%s,%s)",[name,genre,number,place,time])
					# 这一句就是将信息保存至t_zhaopin表中
				else:
					break
		connect.commit()   #我们需要提交数据库,否则数据还是不能上传的
		con.close()   #关闭游标
		connect.close()  #关闭数据库
		print("Over!!!!!!!!!")

	def parse(self,response):
		self.count += 1
		name = response.xpath('//table//td[@class="l square"]//a//text()').extract()
		genre = response.xpath('//table//tr[not(@class="h")]//td[2][not(@align="center")]//text()').extract()
		number = response.xpath('//table//tr[not(@class="h")]//td[3][not(@align="center")]//text()').extract()
		place = response.xpath('//table//tr[not(@class="h")]//td[4][not(@align="center")]//text()').extract()
		time = response.xpath('//table//tr[not(@class="h")]//td[5][not(@align="center")]//text()').extract()

		with open(self.filename,"a") as f: #将我们获取到的信息保存到本地
			for i in range(len(genre)):  #以某个属性的长度来循环
				f.write(name[i]+";")     #我们将这些信息保存起来,并用;来分隔
				f.write(genre[i]+";")
				f.write(number[i]+";")
				f.write(place[i]+";")
				f.write(time[i]+"\n")

		new_url = response.xpath('//*[@id="next"]//@href').extract()
		new_url = self.url+new_url[0]
		print("Over")
		sleep(0.5)

		if self.count<=20:
			yield Request(url=new_url,callback=self.parse)  #循环获取20页的内容就行了
		else:
			self.database(self.filename)   #当超过20页时跳出返回,调用database函数存信息到数据库


以上是完整的代码,可以根据自己的实际情况来修改。


难的地方应该没有,但是对于一个初学者,细节还要是有很多的,我刚开始就是忘记了提交数据,找了很久的问题,郁闷。。。。。。

相互学习,可以用讨论,希望对大家有帮助