爬取當(dāng)當(dāng)數(shù)據(jù)

目的:練習(xí)爬取當(dāng)當(dāng)網(wǎng)站特定關(guān)鍵詞下圖書數(shù)據(jù)烙博,并將抓取到的數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)中

1.新建項(xiàng)目當(dāng)當(dāng):

scrapy startproject dd

2.cd 到項(xiàng)目目錄

cd dd
image.png

3.創(chuàng)建當(dāng)當(dāng)爬蟲 叛买,用基本爬蟲模板

scrapy genspider -t basic dd_spider dangdang.com

image.png

4.使用pycharm打開dd項(xiàng)目


image.png

5.打開當(dāng)當(dāng)沸枯,搜索特定的關(guān)鍵字的圖書分析網(wǎng)頁(yè)和需要抓取的字段

image.png
# -*- coding: utf-8 -*-

import scrapy

class DdItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

     title = scrapy.Field()
     link = scrapy.Field()
     now_price = scrapy.Field()
     comment_num = scrapy.Field()
     detail = scrapy.Field()
    

6.打開爬蟲文件唤殴,導(dǎo)入剛編寫的item斋攀,以及修改的開始的爬取網(wǎng)址

from dd.items import DdItem

定義Item

     item = DdItem()
        item["title"] = response.xpath("http://p[@class='name']/a/@title").extract()
        item["link"] = response.xpath("http://p[@class='name']/a/@href").extract()
        item["now_price"] = response.xpath("http://p[@class='price']/span[@class='search_now_price']/text()").extract()
        item["comment_num"] = response.xpath("http://p/a[@class='search_comment_num']/text()").extract()
        item["detail"] = response.xpath("http://p[@class='detail']/text()").extract()
        yield item

定義循環(huán)爬取方法

     for i in range(2,27):
            url = "http://search.dangdang.com/?key=python&act=input&page_index="+str(i)
            yield Request(url, callback=self.parse())

完整的代碼

# -*- coding: utf-8 -*-
import scrapy
from dd.items import DdItem
from scrapy.http import Request

class DdSpiderSpider(scrapy.Spider):
    name = 'dd_spider'
    allowed_domains = ['dangdang.com']
    start_urls = ['http://search.dangdang.com/?key=python&act=input&page_index=1']

    def parse(self, response):
        item = DdItem()
        item["title"] = response.xpath("http://p[@class='name']/a/@title").extract()
        item["link"] = response.xpath("http://p[@class='name']/a/@href").extract()
        item["now_price"] = response.xpath("http://p[@class='price']/span[@class='search_now_price']/text()").extract()
        item["comment_num"] = response.xpath("http://p/a[@class='search_comment_num']/text()").extract()
        item["detail"] = response.xpath("http://p[@class='detail']/text()").extract()
        yield item

        for i in range(2,27):
            url = "http://search.dangdang.com/?key=python&act=input&page_index="+str(i)
            yield Request(url, callback=self.parse())

image.png

7.在setting中,取消注釋Pipeline的注釋,以及將Robots協(xié)議設(shè)置為False

ITEM_PIPELINES = {
   'dd.pipelines.DdPipeline': 300,
}

ROBOTSTXT_OBEY = False

image.png
image.png

8.打開pipelines文件
通過(guò)for循環(huán)讀取爬取到的itme的值,并打印測(cè)試抓取效果

class DdPipeline(object):
    def process_item(self, item, spider):

        for i in range(0,len(item["title"])):
            title = item["title"][i]
            link = item["link"][i]
            now_price = item["now_price"][i]
            comment_num = item["comment_num"][i]
            detail = item["detail"][i]
            print(title)
            print(link)
            print(now_price)
            print(comment_num)
            print(detail)
        return item
image.png

9.運(yùn)行爬蟲查看效果,使用pycharm的Terminal或mac終端弧哎,進(jìn)入的dd的文件夾目錄輸入

scrapy crawl dd_spider --nolog

image.png
image.png
image.png

10.爬取沒(méi)問(wèn)題雁比,接下來(lái)要將抓取到的數(shù)據(jù),存入到Mysql的數(shù)據(jù)庫(kù)中,使用的是第三方庫(kù)PyMysql撤嫩,提前安裝好PyMysql偎捎,直接使用命令 pip install pymysql 來(lái)安裝。

11.終端打開并連接上mysql ,輸入創(chuàng)建數(shù)據(jù)庫(kù)dd命令,并切換成dd數(shù)據(jù)庫(kù)

create database dd;

use dd;
image.png

創(chuàng)建數(shù)據(jù)庫(kù)表books茴她,并創(chuàng)建需要存儲(chǔ)的相應(yīng)字段:
自動(dòng)自增id蜕径,title,link败京,now_price,comment_num梦染,detail

create table books(id int AUTO_INCREMENT PRIMARY KEY,title char(200),link char(100)unique,now_price int(10),comment_num char(100),detail char(255) );

12.導(dǎo)入pymysql

import pymysql

# -*- coding: utf-8 -*-

import pymysql

class DdPipeline(object):
    def process_item(self, item, spider):
        #創(chuàng)建連接
        conn = pymysql.connect(host="127.0.0.1",user="root",passwd="654321",db="dd")
        for i in range(0,len(item["title"])):
            title = item["title"][i]
            link = item["link"][i]
            now_price = item["now_price"][i]
            comment_num = item["comment_num"][i]
            detail = item["detail"][i]
            #構(gòu)建sql語(yǔ)句插入數(shù)據(jù)
            sql = "insert into books(title,link,now_price,comment_num,detail) VALUES ('"+title+"','"+link+"','"+now_price+"','"+comment_num+"','"+detail+"')"
            conn.query(sql)
        #關(guān)閉連接
        conn.close()
        return item

無(wú)法爭(zhēng)取的寫入寫入數(shù)據(jù)庫(kù)赡麦,報(bào)ModuleNotFoundError: No module named 'pymysql'
還沒(méi)找到解決方案


image.png

解決辦法:更換SQL語(yǔ)句的寫法

     conn = pymysql.connect(host="127.0.0.1",user="root",passwd="654321",db="dd",charset='utf8')
        cursor = conn.cursor()
        cursor.execute('set names utf8')  # 固定格式
        cursor.execute('set autocommit=1')  # 設(shè)置自動(dòng)提交
         sql = "insert into goods(title,link,now_price,comment_num,detail) VALUES (%s,%s,%s,%s,%s)"
            param = (title,link,now_price,comment_num,detail)
            cursor.execute(sql,param )
            conn.commit()

完整的代碼

# -*- coding: utf-8 -*-

import pymysql

class DdPipeline(object):
    def process_item(self, item, spider):
        #創(chuàng)建連接
        conn = pymysql.connect(host="127.0.0.1",user="root",passwd="654321",db="dd",charset='utf8')
        cursor = conn.cursor()
        cursor.execute('set names utf8')  # 固定格式
        cursor.execute('set autocommit=1')  # 設(shè)置自動(dòng)提交
        for i in range(0,len(item["title"])):
            title = item["title"][i]
            link = item["link"][i]
            now_price = item["now_price"][i]
            comment_num = item["comment_num"][i]
            detail = item["detail"][i]
            sql = "insert into goods(title,link,now_price,comment_num,detail) VALUES (%s,%s,%s,%s,%s)"
            param = (title,link,now_price,comment_num,detail)
            cursor.execute(sql,param )
            conn.commit()
        cursor.close()
        #關(guān)閉連接
        conn.close()
        return item

image.png
image.png

心得,出現(xiàn)問(wèn)題比較多的是數(shù)據(jù)的編碼問(wèn)題帕识,數(shù)據(jù)表字段的編碼如何存入的字段編碼不符可能會(huì)存不進(jìn)去泛粹,也可能是亂碼

優(yōu)化:

1.抓取的到當(dāng)當(dāng)?shù)脑u(píng)論數(shù)和價(jià)格都是字符,需要轉(zhuǎn)化成數(shù)字肮疗,這樣方便進(jìn)行排序
2.寫入數(shù)據(jù)庫(kù)的時(shí)候使用Try 代碼更健壯

        def getNumber(string):
            newString = string.encode('UTF-8')
            lastStr = re.findall(r"\d+\.?\d*", newString)
            yield int(lastStr)

參考文章:http://blog.csdn.net/think_ma/article/details/78900218

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晶姊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伪货,更是在濱河造成了極大的恐慌们衙,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碱呼,死亡現(xiàn)場(chǎng)離奇詭異蒙挑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)愚臀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門忆蚀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人姑裂,你說(shuō)我怎么就攤上這事馋袜。” “怎么了舶斧?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵欣鳖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茴厉,道長(zhǎng)观堂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任呀忧,我火速辦了婚禮师痕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘而账。我一直安慰自己胰坟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笔横,像睡著了一般竞滓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吹缔,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天商佑,我揣著相機(jī)與錄音,去河邊找鬼厢塘。 笑死茶没,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晚碾。 我是一名探鬼主播抓半,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼格嘁!你這毒婦竟也來(lái)了笛求?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤糕簿,失蹤者是張志新(化名)和其女友劉穎探入,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懂诗,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡新症,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了响禽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徒爹。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芋类,靈堂內(nèi)的尸體忽然破棺而出隆嗅,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站凸舵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丽焊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一咕别、第九天 我趴在偏房一處隱蔽的房頂上張望技健。 院中可真熱鬧,春花似錦惰拱、人聲如沸雌贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欣孤。三九已至馋没,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間降传,已是汗流浹背篷朵。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婆排,地道東北人声旺。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像泽论,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卡乾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350