您的位置:首页 > 编程语言 > Python开发

scrapy框架爬取数据入库(附详细介绍)

2018-03-19 16:20 302 查看

在论坛上看过很多的scrapy数据入库(mysql)的例子,但是我尝试之后总是出现一些莫名其妙的错误,搞得自己走了很多弯路,于是我将我认为是最简单易懂的方法和代码展示给大家,欢迎大家吐槽

1.创建scrapy项目(安装scrapy框架和mysql数据库就不在这讨论了,论坛上也有很多),在这里我创建的项目名称是“testmysql”,命令(cmd)是“scrapy startproject testmysql”,最好是在你想要创建项目的目录里面创建,创建好后,会看到如下文件



2.创建spider文件,CD命令到testmysql文件夹(上图的第一个testmysql文件夹)下,输入命令(scrapy genspider yingyeyuan cs.58.com/yingyeyuan/)(这里你也可以手动增加该文件),然后就会看到有一个yinyeyuan.py的文件生成,好了,之后就在这里面写爬虫代码吧!



3.开始编写spider ,我爬的是58同城上的营业员相关的职业,所以第二步要在代码里面写 “cs.58.com/yingyeyuan/”,然后将页面的标题,工资,福利,公司名称,代码如下:# -*- coding: utf-8 -*-
import scrapy

class YinyeyuanSpider(scrapy.Spider):
name = 'yingyeyuan'
# allowed_domains = ['http://cs.58.com/yingyeyuan/']
start_urls = ['http://cs.58.com/yingyeyuan/']

def parse(self, response):
# 获取标题
title = response.xpath(".//*[@id='list_con']/li/div[1]/div[1]/a/span[2]/text()").extract()
# 获取公司名称
comname = response.xpath(".//*[@id='list_con']/li/div[2]/div/a/text()").extract()
# 获取工资
money = response.xpath(".//*[@id='list_con']/li/div[1]/p/text()").extract()
# 获取福利
getfree = response.xpath(".//*[@id='list_con']/li/div[1]/div[2]/span[1]/text()").extract()4.将得到的数据保存到items中去,所以要讲items.py导入到此文件中来(比上面多了几行代码而已),注意,最下面的yield语句一定要有,这个地方害我走了很多弯路,就这一句代码,

:# -*- coding: utf-8 -*-
import scrapy
from ..items import TestmysqlItem

class YinyeyuanSpider(scrapy.Spider):
name = 'yingyeyuan'
# allowed_domains = ['http://cs.58.com/yingyeyuan/']
start_urls = ['http://cs.58.com/yingyeyuan/']

def parse(self, response):
# 获取标题
title = response.xpath(".//*[@id='list_con']/li/div[1]/div[1]/a/span[2]/text()").extract()
# 获取公司名称
comname = response.xpath(".//*[@id='list_con']/li/div[2]/div/a/text()").extract()
# 获取工资
money = response.xpath(".//*[@id='list_con']/li/div[1]/p/text()").extract()
# 获取福利
getfree = response.xpath(".//*[@id='list_con']/li/div[1]/div[2]/span[1]/text()").extract()
# 实例化TongchengItem类
tongcheng = TestmysqlItem()
# 存入items
tongcheng["title"] = title
tongcheng["comname"] = comname
tongcheng["money"] = money
tongcheng["getfree"] = getfree
yield tongcheng
5.到了这步,就可以开始编写入库代码了,找到项目目录下的pipelines.py文件:



输入如下代码,我是存入mysql数据库,具体根据你的数据库来(解释:__init__函数里面初始化时就连接数据库,这样会方便很多,毕竟增删改查都要用到这些代码,同时输出下,确保程序运行到这里。process_items函数就是入库的操作,items由于是所有的数据的集合,所以要循环执行,try 语句确保入库成功,不成功就返回错误原因):import pymysql

class TestmysqlPipeline(object):
def __init__(self):
# connection database
self.connect = pymysql.connect('localhost','root','root','tongcheng',use_unicode=True,charset='utf8')
# get cursor
self.cursor = self.connect.cursor()
print("connecting mysql success!")

def process_item(self, item, spider):
print("start writing datas...")
try:
for i in range(0,len(item['title'])):
# insert data
sqlstr = "insert into zhaoping(title,companyname,getfree,money) VALUES('%s','%s','%s','%s')"%(item['title'][i],item['comname'][i],item['getfree'][i],item['money'][i])
self.cursor.execute(sqlstr)
self.connect.commit()
self.connect.close()
except Exception as error:
# print error
print(error)
return item6.修改settings.py文件,如果不修改,程序就不会知道你要执行哪个操作,默认情况下,它被注释了,去掉注释就好(300其实就是个执行顺序,越小执行越优先):# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES = {
'testmysql.pipelines.TestmysqlPipeline': 300,
}7.试试看,输入命令“scarpy crawl yingyeyuan”,再去看看数据库,是不是很神奇啊?(大神勿喷)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python scrapy mysql