yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL
一、創建爬蟲項目
注意:不能直接使用PyCharm創建Scrapy項目,所以需要在爬蟲實戰三、PyCharm搭建Scrapy開發調試環境的基礎(PyCharm配置完Scrapy)之上,選中mySpider項目,點擊PyCharm中下方的Terminal,進入對應的命令行,執行命令創建doubanSpider項目
scrapy startproject doubanSpider
進入命令行。
TIM截圖20190215160227.png
創建項目。
圖片.png
二、創建爬蟲并編寫代碼
爬蟲項目生成后,進入項目路徑。
圖片.png
執行命令創建douban爬蟲
scrapy genspider douban "movie.douban.com"
2-1、編寫items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class DoubanspiderItem(scrapy.Item):
# 電影標題
title = scrapy.Field()
# 電影信息
info = scrapy.Field()
# 電影評分
score = scrapy.Field()
# 評分人數
number = scrapy.Field()
# 簡介
content = scrapy.Field()
2-2、編寫spiders/douban.py
# -*- coding: utf-8 -*-
import scrapy
from doubanSpider.items import DoubanspiderItem
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
start = 0
url = 'https://movie.douban.com/top250?start='
end = '&filter='
start_urls = [url + str(start) + end]
def parse(self, response):
item = DoubanspiderItem()
movies = response.xpath("//div[@class=\'info\']")
for movie in movies:
name = movie.xpath('div[@class="hd"]/a/span/text()').extract()
message = movie.xpath('div[@class="bd"]/p/text()').extract()
star = movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()
number = movie.xpath('div[@class="bd"]/div[@class="star"]/span/text()').extract()
quote = movie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract()
if quote:
quote = quote[0]
else:
quote = ''
item['title'] = ''.join(name)
item['info'] = quote
item['score'] = star[0]
item['content'] = ';'.join(message).replace(' ', '').replace('\n', '')
item['number'] = number[1].split('人')[0]
# 提交item
yield item
if self.start <= 225:
self.start += 25
yield scrapy.Request(self.url + str(self.start) + self.end, callback=self.parse)
2-3、編寫pipelines.py
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from pymysql import cursors
from twisted.enterprise import adbapi
import time
import copy
class DoubanspiderPipeline(object):
# 初始化函數
def __init__(self, db_pool):
self.db_pool = db_pool
# 從settings配置文件中讀取參數
@classmethod
def from_settings(cls, settings):
# 用一個db_params接收連接數據庫的參數
db_params = dict(
host=settings['MYSQL_HOST'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWORD'],
port=settings['MYSQL_PORT'],
database=settings['MYSQL_DBNAME'],
charset=settings['MYSQL_CHARSET'],
use_unicode=True,
# 設置游標類型
cursorclass=cursors.DictCursor
)
# 創建連接池
db_pool = adbapi.ConnectionPool('pymysql', **db_params)
# 返回一個pipeline對象
return cls(db_pool)
# 處理item函數
def process_item(self, item, spider):
# 對象拷貝,深拷貝 --- 這里是解決數據重復問題!!!
asynItem = copy.deepcopy(item)
# 把要執行的sql放入連接池
query = self.db_pool.runInteraction(self.insert_into, asynItem)
# 如果sql執行發送錯誤,自動回調addErrBack()函數
query.addErrback(self.handle_error, item, spider)
# 返回Item
return item
# 處理sql函數
def insert_into(self, cursor, item):
# 創建sql語句
sql = "INSERT INTO movie (title,info,score,number,content,createtime) VALUES ('{}','{}','{}','{}','{}','{}')".format(
item['title'], item['info'], item['score'], item['number'], item['content'],
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 執行sql語句
cursor.execute(sql)
# 錯誤函數
def handle_error(self, failure, item, spider):
# #輸出錯誤信息
print("failure", failure)
2-4、編寫settings.py
# -*- coding: utf-8 -*-
BOT_NAME = 'doubanSpider'
SPIDER_MODULES = ['doubanSpider.spiders']
NEWSPIDER_MODULE = 'doubanSpider.spiders'
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'doubanSpider.pipelines.DoubanspiderPipeline': 300
}
# 連接數據MySQL
# 數據庫地址
MYSQL_HOST = 'localhost'
# 數據庫用戶名:
MYSQL_USER = 'root'
# 數據庫密碼
MYSQL_PASSWORD = 'root'
# 數據庫端口
MYSQL_PORT = 3306
# 數據庫名稱
MYSQL_DBNAME = 'mydb'
# 數據庫編碼
MYSQL_CHARSET = 'utf8'
在創建爬蟲并編寫代碼時遇到的坑
坑1、Unresolved reference ‘xxx’ 或者顯示 scrapy No module named ×××.items
TIM截圖20190215170939.png
坑1、解決辦法
將爬蟲項目的文件夾類型改為Sources Root
TIM截圖20190215171022.png
坑2、連接MySQL時缺少pymysql
TIM截圖20190215171154.png
坑2、解決辦法
點擊File-> Settings->Project: mySpider->Project Interpreter,導入pymysql包。具體添加包的流程參考爬蟲實戰三、PyCharm搭建Scrapy開發調試環境。
TIM截圖20190215171242.png
三、使用Pycharm連接MySQL數據庫
連接MySQL的工具有很多,Pycharm本身也可以連接MySQL和其他多種數據庫,并且提示功能比較強大,這里我使用Pycharm連接MySQL數據庫。
TIM截圖20190215171919.png
選擇數據庫類型,MySQL
TIM截圖20190215171941.png
設置連接別名,主機,數據庫,用戶名,密碼。
TIM截圖20190215172302.png
設置完畢,連接MySQL。
圖片.png
四、創建爬蟲項目對應的表以及執行爬蟲。
4-1、創建表
圖片.png
創建movie表,注意 default charset = utf8 此處要和爬蟲程序編碼一致,否則存入到MySQL失敗。
drop table movie;
CREATE TABLE `movie`
(
`id` int(100) NOT NULL AUTO_INCREMENT,
`title` varchar(2048) DEFAULT NULL,
`info` varchar(2048) DEFAULT NULL,
`score` varchar(2048) DEFAULT NULL,
`number` varchar(2048) DEFAULT NULL,
`content` varchar(2048) DEFAULT NULL,
`createtime` varchar(2048) DEFAULT NULL,
PRIMARY KEY (`id`)
) engine = InnoDB
default charset = utf8;
4-2、執行爬蟲
在爬蟲項目對應的命令行中執行命令,運行爬蟲
scrapy crawl douban
TIM截圖20190215171741.png
4-3、查詢數據,驗證結果
在本地連接中執行SQL:
select * from movie;
TIM截圖20190215172554.png
爬蟲數據并存入MySQL成功。注意,網上有部分博客實踐后出現數據重復問題,此處我已經修改過代碼保證數據不重復。
TIM截圖20190215172854.png
總結
以上是生活随笔為你收集整理的yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis-server启动但进程里没有
- 下一篇: yum源无法安装mysql_Centos