參考資料:
我的測試:
-
新建項目
目標文件夾下命令行執(zhí)行:
scrapy startproject 項目名稱
-
項目目錄結構
scrapy.cfg:項目配置文件
myScrapyProject:
myScrapyProject/items.py:自定義項目類的地方鹊漠,也就是爬蟲獲取到數據之后艺演,傳入管道文件pipelines.py的載體
myScrapyProject/pipelines.py:項目管道文件,對傳入的項目類中的數據進行一個清理和入庫
myScrapyProject/middlewares.py:中間件配置文件
myScrapyProject/settings.py:項目的設置文件铛纬,例如下載延遲跷究,項目管道文件中類的啟用以及自定義中間件的啟用和順序
spiders:是我們爬蟲文件集合肴掷,在這里新建爬蟲文件
-
新建爬蟲
在spiders下新建一個Python文件块蚌,用于編寫爬蟲
# coding:utf-8
import scrapy
# 爬蟲類机蔗,繼承自scrapy.Spider類
class PrizeSpider(scrapy.Spider):
# 爬蟲名稱
name = "prize"
# 目標網址蒲祈,爬蟲啟動后自動爬取得鏈接,列表內可以放多個鏈接
start_urls = ['http://www.cgscgs.org.cn/drupal/?q=node/95']
# 爬蟲啟動時萝嘁,爬取鏈接成功后自動回調的函數梆掸,默認parse,參數self和response
def parse(self, response):
print(response)
# extract():序列化該節(jié)點為unicode字符串并返回list牙言;extract_first()則是去第一個元素
title_list = response.xpath("http://*[@id='node-95']/div[1]/dl/dt/a/text()").extract()
content_list = response.xpath("http://*[@id='node-95']/div[1]/dl/dd/text()").extract()
for i, j in zip(title_list, content_list):
print(i, ":", j)
-
打開PyCharm命令行
查看爬蟲列表酸钦,羅列所有爬蟲的名稱
scrapy list
啟動爬蟲
scrapy crawl 爬蟲名稱
過程解析
Scrapy為Spider的
start_urls
屬性中的每個URL創(chuàng)建了scrapy.Request
對象,并將parse
方法作為回調函數(callback)賦值給了Request咱枉。
Request對象經過調度卑硫,執(zhí)行生成 scrapy.http.Response
對象并送回給spider parse()
方法。parse()
方法是Scrapy默認的網站爬取成功時的回調函數蚕断,所以它一定有一個response參數
-
將數據存到MySQL中
上面編寫的spider類是用來爬蟲欢伏,他只負責獲取數據,而錄入數據則是在“管道文件”pipelines中完成
首先在settings文件中啟用管道類
ITEM_PIPELINES = {
# 'myScrapyProject.pipelines.MyscrapyprojectPipeline': 300,
# 類名稱:優(yōu)先級(0-1000)
'myScrapyProject.pipelines.MyscrapyprojectPipeline': 300,
}
編寫管道類
# -*- coding: utf-8 -*-
import pymysql
class MyscrapyprojectPipeline(object):
# 爬蟲開始運行的時候運行
def open_spider(self, spider):
print("連接數據庫")
self.connect = pymysql.connect(
host='127.0.0.1',
port=3306,
db='test',
user='admin',
passwd='123456',
charset='utf8')
self.cursor = self.connect.cursor()
# 爬蟲獲取的數據并不是直接傳入管道中亿乳,而是賦值到items的item中硝拧,然后item作為參數傳入到該方法中
# 最終數據可以通過管道文件寫入到數據庫中
def process_item(self, item, spider):
# print(spider.name)
print("sql")
insert_sql = "insert into prize(title,content) values('{}','{}')".format(item['title'], item['content'])
print(insert_sql)
self.cursor.execute(insert_sql)
self.connect.commit()
return item
# 爬蟲關閉時調用
def spider_close(self, spider):
self.connect.close()
編寫item
class MyscrapyprojectItem(scrapy.Item):
title = scrapy.Field()
content = scrapy.Field()
修改爬蟲文件
class PrizeSpider(scrapy.Spider):
# 爬蟲名稱
name = "prize"
# 目標網址,爬蟲啟動后自動爬取得鏈接葛假,列表內可以放多個鏈接
start_urls = ['http://www.cgscgs.org.cn/drupal/?q=node/95']
# 爬蟲啟動時河爹,爬取鏈接成功后自動回調的函數,默認parse桐款,參數self和response
def parse(self, response):
print(response)
# 實例化item對象
pr = MyscrapyprojectItem()
title_list = response.xpath("http://*[@id='node-95']/div[1]/dl/dt/a/text()").extract()
content_list = response.xpath("http://*[@id='node-95']/div[1]/dl/dd/text()").extract()
for i, j in zip(title_list, content_list):
# 將爬取的數據寫入到item中
pr['title'] = i
pr['content'] = j
# 注意這里要用yield咸这,因為item是單個傳遞的
# yield可以理解為return,將pr返回魔眨,但是下一次警戒著上次的循環(huán)繼續(xù)執(zhí)行
yield pr