1. 程式人生 > >使用Scrapy爬取笑話並存儲到檔案和MySQL

使用Scrapy爬取笑話並存儲到檔案和MySQL

由於專案的需要,必須學習如何使用Scrapy來爬取資料。這篇部落格以爬取笑話網的資料為例,說明Scrapy的基本使用。

安裝配置

我的系統是Win10 64位。因為Python3並不能完全支援Scrapy,因此為了完美執行Scrapy,我們使用Python2.7來編寫和執行Scrapy。

在完成了上面的步驟後再執行一次pip install scrapy,然後再嘗試執行一下scrapy,如果出現類似的輸出,則下載成功。

Scrapy 1.3.2 - no active project

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  commands
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

  [ more ]      More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command

建立專案

使用下面的命令建立一個專案:

scrapy startproject joke

建立好的專案結構如下圖所示:

檔案說明:

  • scrapy.cfg 專案的配置資訊,主要為Scrapy命令列工具提供一個基礎的配置資訊。(真正爬蟲相關的配置資訊在settings.py檔案中)
  • items.py 設定資料儲存模板,用於結構化資料,如:Django的Model
  • pipelines 資料處理行為,如:一般結構化的資料持久化
  • settings.py 配置檔案,如:遞迴的層數、併發數,延遲下載等
  • spiders 爬蟲目錄,如:建立檔案,編寫爬蟲規則

注意:一般建立爬蟲檔案時,以網站域名命名

編寫爬蟲

在spiders目錄中新建 xiaohua_spider.py 檔案。

程式碼如下:

import scrapy


class XiaoHuarSpider(scrapy.spiders.Spider):
    name = "xiaohua"
    allowed_domains = ["xiaohua.com"]
    start_urls = [
        "http://xiaohua.com/Index/index/type/1.html",
    ]

    def parse(self, response):
        # print(response, type(response))
        # from scrapy.http.response.html import HtmlResponse
        # print(response.body_as_unicode())

        current_url = response.url  # 爬取時請求的url
        body = response.body  # 返回的html
        unicode_body = response.body_as_unicode()  # 返回的html unicode編碼

幾個注意要點:

  1. 爬蟲檔案需要定義一個類,並繼承scrapy.spiders.Spider
  2. 必須定義name,即爬蟲名,如果沒有name,會報錯。因為原始碼中是這樣定義的:
  3. 編寫函式parse,這裡需要注意的是,該函式名不能改變,因為Scrapy原始碼中預設callback函式的函式名就是parse;
  4. 定義需要爬取的url,放在列表中,因為可以爬取多個url,Scrapy原始碼是一個For迴圈,從上到下爬取這些url,使用生成器迭代將url傳送給下載器下載url的html。

執行爬蟲

進入joke的目錄,使用下面的命令可以啟動爬蟲。

scrapy crawl xiaohua

沒有錯誤就可以進行下面一步了。

爬取起始頁的笑話

用Chrome分析頁面結構,如下圖所示。

可以看出使用//p[@class='fonts']/a/text()就可以拿到所有的笑話文字了。

程式碼如下:

import scrapy
from scrapy.selector import HtmlXPathSelector


class XiaoHuarSpider(scrapy.spiders.Spider):
    name = "xiaohua"
    allowed_domains = ["xiaohua.com"]
    start_urls = [
        "http://xiaohua.com/Index/index/type/1.html",
    ]

    def parse(self, response):

        hxs = HtmlXPathSelector(response)

        items = hxs.select('''//p[@class='fonts']/a/text()''')

        for item in items:
            text = item.extract()
            text = text.strip()
            print(text)

然後使用下面的命令執行爬蟲即可得到輸出結果:

scrapy crawl xiaohua --nolog

輸出結果如下:

和朋友去吃飯,一哥們喝醉了,跟服務員說:“你猜我用手能起開這瓶啤酒嗎?”服務員笑了下,但是沒說。那哥們又問:“ 你猜我用 手能起開這瓶啤酒不?”服務員說不信,那哥們說:“不信你TM還不去給我拿起子!”

早上起床,不愛搭理老婆。。。。。老婆跟我說話問我幹啥呢!我說死了,又問:那怎麼睜著眼睛?我說:死不瞑目!又問:那為啥還喘氣 ?我說:咽不下這口氣。。。。。。

今天看到的最感人朋友圈:一位大哥真誠地勸大家不要再吃轉基因食品了!對孩子傷害很大!他孩子和他做親子鑑定基因不匹配,就是因為孩子吃轉基因食品把基因改變了。這些知識都是他老婆告訴他的…

有一室友特膽小,晚上一人在廁所大號,廁所沒燈,我們幾個拿著手電筒照著自己的鬼臉,一進廁所那貨嚇得鬼哭狼嚎的,突然抓起幾把屎丟過來!大晚上他在洗手,我們哥幾個在洗澡!

物理課上,我心不在焉的趴在桌上,一心卻想著去網咖擼幾把。這時,老師問:“搬運物體怎麼樣能省力?”有同學回答:“滾!”“回答正確!滾!”老師大聲說…話音剛落,我習慣性從座位上站起來,默默地朝網咖飛奔而去了…身後,老師吶喊:鋤小明!你給我回來…

去食堂吃飯,想打點熱水回來洗澡,就把桶帶上了。排隊時,視窗阿姨拿著鍋鏟衝我這邊吆喝:那小夥子,就你,別往後看,吃飯帶飯盒可以,帶飯桶不行!趕緊換一個!”我……

什麼叫賭氣、我妹買了一輛寶馬X6天天嘚瑟,我就買了一輛蘭博基尼!她一開我就撞!要不是賣家多送了兩塊大電池,還真撞不過!

忍不住看完了。。。

來,繼續。

遞迴爬取網頁

接下來我們需要完成的是繼續爬取下一頁的笑話。使用Chrome可以看到請求載入下一頁笑話的地址是:http://xiaohua.com/index/more,請求方式是POST,還帶了一個引數:type=1。如下圖所示:

在解析完成之後只要使用下面的語句就可以遞迴爬取網頁了。

yield Request(url, callback=self.parse)

程式碼如下:

import scrapy
from scrapy import FormRequest
from scrapy.selector import HtmlXPathSelector


class XiaoHuarSpider(scrapy.spiders.Spider):
    name = "xiaohua"
    allowed_domains = ["xiaohua.com"]
    start_urls = [
        "http://xiaohua.com/Index/index/type/1.html",
    ]

    def parse(self, response):

        hxs = HtmlXPathSelector(response)

        items = hxs.select('''//p[@class='fonts']/a/text()''')

        for item in items:
            text = item.extract()
            text = text.strip() + '\n'
            print(text)

        # recursively get more jokes
        more_url = 'http://xiaohua.com/index/more'
        return FormRequest(url=more_url,
                    formdata={'type': '1'},
                    dont_filter=True,
                    callback=self.parse)

然後還有一項工作,我們需要配置一個引數用於控制爬蟲爬取的深度(就是載入more的次數)不然我們永遠也結束不了了。

在settings.py檔案中配置DEPTH_LIMIT引數即可。如下圖所示:

然後使用下面的命令執行爬蟲即可:

scrapy crawl xiaohua --nolog

格式化處理

現在我們要做更多的事。之前我們拿到的只有笑話的文字資料,但是從頁面上來看還有更多的內容可以拿。

如圖所示,接下來可以獲取發笑話的使用者名稱,贊數,踩數,評論數。這樣我們就可以拿到最好笑的笑話,或者說可以看那個使用者發的笑話最受歡迎,重點的看他發的笑話。

修改items.py:

程式碼如下:

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

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class JokeItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    user_name = scrapy.Field()
    up_vote_num = scrapy.Field()
    down_vote_num = scrapy.Field()
    comment_num = scrapy.Field()
    joke_text = scrapy.Field()

然後對Spider的程式碼進行一些修改:

import scrapy
from scrapy import FormRequest
from scrapy.selector import HtmlXPathSelector

from joke.items import JokeItem


class XiaoHuarSpider(scrapy.spiders.Spider):
    name = "xiaohua"
    allowed_domains = ["xiaohua.com"]
    start_urls = [
        "http://xiaohua.com/Index/index/type/1.html",
    ]

    def parse(self, response):

        items = response.xpath('''//div[@class='one-cont']''')

        for item_selector in items:
            # go on to get elements
            user_name = item_selector.xpath('''.//div[@class='one-cont-font clearfix']/i/text()''').extract_first()
            up_vote_num = item_selector.xpath('''.//li[@class='active zan range']/span/text()''').extract_first()
            down_vote_num = item_selector.xpath('''.//li[@class='range cai']/span/text()''').extract_first()
            comment_num = item_selector.xpath('''.//li[@class='range jxi']/span/text()''').extract_first()
            joke_text = item_selector.xpath('''.//p[@class='fonts']/a/text()''').extract_first()
            joke_text = joke_text.strip() + '\n'
            joke_id = item_selector.xpath('''.//p[@class='fonts']/a/@href''').extract_first()
            joke_id = joke_id.replace('/Index/pinlun/id/','')
            joke_id = joke_id.replace('/type/1.html','')

            # data_list = [joke_id,user_name,up_vote_num,down_vote_num,comment_num]
            # print('\t'.join(data_list))
            # print(joke_text)
            item = JokeItem()
            item['joke_id'] = joke_id
            item['user_name'] = user_name
            item['up_vote_num'] = up_vote_num
            item['down_vote_num'] = down_vote_num
            item['comment_num'] = comment_num
            item['joke_text'] = joke_text
            yield item

        # recursively get more jokes
        more_url = 'http://xiaohua.com/index/more'
        yield FormRequest(url=more_url,
                    dont_filter=True,
                    formdata={'type': '1'},
                    callback=self.parse)

呼叫yield item之後Scrapy就會把Item交給pipelines的類來處理。

修改pipelines.py。

我們先把爬到的笑話存到一個檔案裡。程式碼如下:

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

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


class JokePipeline(object):
    def process_item(self, item, spider):
        return item


class JokeFilePipeLine(object):
    def __init__(self):
        self.file = open('d:/jokes', 'wb')

    def process_item(self, item, spider):
        line = "%s\t%s\t%s\t%s\t%s\t%s\n" % (item['joke_id'],
                                             item['user_name'],
                                             item['up_vote_num'],
                                             item['down_vote_num'],
                                             item['comment_num'],
                                             item['joke_text'])
        self.file.write(line.encode("utf-8"))
        return item

然後修改一下settings.py,指定使用我們新寫的pipeline。

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'joke.pipelines.JokePipeline': None,
    'joke.pipelines.JokeFilePipeLine': 300
}

後面的None是指不使用這個pipeline,300是一個優先順序,數字越大,優先順序越高。

執行後即可在檔案中看到爬取的笑話。

將笑話寫入MySQL

配置Python和MySQL的連線

建立表和儲存過程

使用下面的程式碼建立表:

CREATE TABLE jokes(
    id VARCHAR(255) PRIMARY KEY,
    userName VARCHAR(255),
    upVoteNum INT,
    downVoteNum INT,
    commentNum INT,
    jokeText TEXT)

使用下面的程式碼建立儲存過程:

DELIMITER $$

CREATE
    PROCEDURE `jokedb`.`addJoke`(IN jokeId VARCHAR(255),IN userName VARCHAR(255),IN upVoteNum INT,IN downVoteNum INT,IN commentNum INT,IN jokeText TEXT)
    BEGIN
    SET @jokeId = jokeId;
    SET @upVoteNum = upVoteNum;
    SET @downVoteNum = downVoteNum;
    SET @commentNum = commentNum;
    SET @jokeText = jokeText;
    SET @userName = userName;

    SET @existsFlag='';

    SELECT id INTO @existsFlag FROM jokes WHERE id = @jokeId LIMIT 1;

    IF @existsFlag = '' THEN

        SET @insertSql = CONCAT('INSERT INTO jokes VALUES(?,?,?,?,?,?)');
        PREPARE stmtinsert FROM @insertSql;  
        EXECUTE stmtinsert USING @jokeId,@userName,@upVoteNum,@downVoteNum,@commentNum,@jokeText;  
        DEALLOCATE PREPARE stmtinsert;
    END IF;
    END$$

DELIMITER ;

呼叫MySQL的儲存過程測試程式碼

# -*- coding: utf-8 -*-
import MySQLdb

conn = MySQLdb.connect(host='localhost',user='root',passwd='sorry',db='jokedb',charset="utf8")
cur =conn.cursor()
cur.callproc('addJoke',('1000','張三',0,100,100,'測試啊啊啊啊'))

cur.close()
conn.commit()
conn.close()

這樣雖然可以實現寫入MySQL,但是沒執行一次都要重新建立連線,非常耗費資源。一個比較好的方法是使用資料庫連線池。

使用下面的程式碼來安裝DBUtils:

pip install DBUtils

然後修改程式碼:

# -*- coding: utf-8 -*-
import MySQLdb

from DBUtils.PooledDB import PooledDB
pool = PooledDB(MySQLdb,5,host='localhost',user='root',passwd='sorry',db='jokedb',port=3306,charset="utf8") #5為連線池裡的最少連線數

conn = pool.connection()
cur =conn.cursor()
cur.callproc('addJoke',('1000','張三',0,100,100,'測試啊啊啊啊'))

cur.close()
conn.commit()
conn.close()

編寫pipelines程式碼

class JokeMySqlPipeLine(object):
    def __init__(self):
        self.pool = PooledDB(MySQLdb,5,host='localhost',user='root',passwd='sorry',db='jokedb',port=3306,charset="utf8")

    def process_item(self, item, spider):
        conn = self.pool.connection()
        cur = conn.cursor()
        cur.callproc('addJoke', (item['joke_id'], item['user_name'], int(item['up_vote_num']),
                                 int(item['down_vote_num']), int(item['comment_num']), item['joke_text']))

        cur.close()
        conn.commit()
        conn.close()

然後把這個pipelines配上去。

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'joke.pipelines.JokePipeline': None,
    'joke.pipelines.JokeFilePipeLine': None,
    'joke.pipelines.JokeMySqlPipeLine': 300
}

執行爬蟲,即可在MySQL中看到爬取到的笑話:

小優化

download_delay

設定這個值可以使爬蟲在爬完一個頁面後停一下,避免太過集中的訪問被伺服器封掉。

可以在settings.py中設定,也可以在Spider中設定,我在Spider中設定了。

class XiaoHuarSpider(scrapy.spiders.Spider):
    name = "xiaohua"
    allowed_domains = ["xiaohua.com"]
    download_delay = 2
    ......

使用user agent池

所謂的user agent,是指包含瀏覽器資訊、作業系統資訊等的一個字串,也稱之為一種特殊的網路協議。伺服器通過它判斷當前訪問物件是瀏覽器、郵件客戶端還是網路爬蟲。在request.headers可以檢視user agent。如下,使用scrapy shell檢視:

scrapy shell http://blog.csdn.net/u012150179/article/details/34486677 

進而輸入如下,可得到uesr agent資訊:

request.headers

由此得到,scrapy本身是使用Scrapy/1.3.2來表明自己身份的。這也就暴露了自己是爬蟲的資訊。

首先編寫自己的UserAgentMiddle中介軟體,新建rotate_useragent.py,程式碼如下:

建立user agent池(user_agent_list)並在每次傳送request之前從agent池中隨機選取一項設定request的User_Agent。編寫的UserAgent中介軟體的基類為UserAgentMiddle。

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

from scrapy import log

"""避免被ban策略之一:使用useragent池。

使用注意:需在settings.py中進行相應的設定。
"""

import random
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class RotateUserAgentMiddleware(UserAgentMiddleware):

    def __init__(self, user_agent=''):
        self.user_agent = user_agent

    def process_request(self, request, spider):
        ua = random.choice(self.user_agent_list)
        if ua:
            # Show current useragent
            print "********Current UserAgent:%s************" %ua

            # do the log
            # log.msg('Current UserAgent: '+ua, level='INFO')
            request.headers.setdefault('User-Agent', ua)

    # the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape
    # for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php
    user_agent_list = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
        "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
       ]

除此之外,要在settings.py(配置檔案)中禁用預設的useragent並啟用重新實現的User Agent。配置方法如下:

#取消預設的useragent,使用新的useragent
DOWNLOADER_MIDDLEWARES = {
        'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
        'joke.rotate_useragent.RotateUserAgentMiddleware' :400
    }

總結

算是初步的體驗了一下Scrapy,感覺還是很強大的。這篇部落格也為專案打下了一定的基礎。後續還要再好好學一下Scrapy。

參考資料

相關推薦

使用Scrapy取笑並存檔案MySQL

由於專案的需要,必須學習如何使用Scrapy來爬取資料。這篇部落格以爬取笑話網的資料為例,說明Scrapy的基本使用。 安裝配置 我的系統是Win10 64位。因為Python3並不能完全支援Scrapy,因此為了完美執行Scrapy,我們使用Pyt

【爬蟲例項1】python3下使用beautifulsoup取資料並存txt檔案

1:執行環境: python: 3.7.0 系統:Windows IDE:pycharm 2017 2:需要安裝的庫: requests 和 beautifulsoup 3:完整程式碼: # cod

使用Python3BeautifulSoup取笑網站內容,並匯入Excel

本文使用Python3和BeautifulSoup爬取網站內容,並匯入Excel。 #抓取糗事百科笑話的指令碼 import urllib.request from bs4 import BeautifulSoup import xlwt #寫入檔案 import

python 讀取資料庫中的BLOB型別欄位,並存檔案到本地

import os import cx_Oracle os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' db_orcl = cx_Oracle.connect("使用者/[email protected]/orcl"

[python爬蟲] Selenium取內容並存MySQL資料庫

        前面我通過一篇文章講述瞭如何爬取CSDN的部落格摘要等資訊。通常,在使用Selenium爬蟲爬取資料後,需要儲存在TXT文字中,但是這是很難進行資料處理和資料分析的。這篇文章主要講述通過Selenium爬取我的個人部落格資訊,然後儲存在資料庫MySQL中,以便

Scrapy取網易雲音樂評論(一、思路分析)

目錄: 前提: scrapy這個框架很多人用過,網上教程也很多,但大多就是爬爬小說這種比較簡單且有規律的,網易雲音樂也有很多人寫過,也有API,不過大多是爬取了熱門歌曲,或是從歌單下手,但是考慮到歌單會有很多重複的。當然,從歌手頁的話,如果

scrapy取拉勾網python職位+Mysql+視覺化

在進行爬取目標網站中為遇到一個問題,爬取5頁資料之後會出錯,設定了每一次請求的隨機超時間10-20->time.sleep(random.randint(10, 20)),同樣會被拉勾網禁止請求資料,可能被輕度判定為爬取,所以可以設定每一次的隨機超時間為20-30秒,就可以解決這個問題。

scrapy取資料之後,如何存入mysql

pipelines.py檔案中新建MySQLPipeline類: # 匯入庫 from scrapy.utils.project import get_project_settings import

scrapy取前程無憂51job網職位資訊並存到資料庫

spiders中程式碼如下 import scrapy from scrapy import Request from QianCheng.items import QianchengItem import re class ExampleSpider(s

java物件序列化並存檔案資料庫

Java中要實現將物件儲存起來持久化,需要讓物件實現Serializable介面,這樣就能將java物件用二進位制流儲存並恢復。下面我將以儲存到檔案和儲存到mysql來進行解析。先給出序列化類的定義:package model; import java.io.Seriali

scrapy 詳細例項-取百度貼吧資料並儲存到檔案資料庫中

Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。使用框架進行資料的爬取那,可以省去好多力氣,如不需要自己去下載頁面、資料處理我們也不用自己去寫。我們只需要關注資料的爬取規則就行,scrap

資料視覺化 三步走(一):資料採集與儲存,利用python爬蟲框架scrapy取網路資料並存

前言     最近在研究python爬蟲,突然想寫部落格了,那就寫點東西吧。給自己定個小目標,做一個完整的簡單的資料視覺化的小專案,把整個相關技術鏈串聯起來,目的就是為了能夠對這塊有個系統的認識,具體設計思路如下: 1. 利用python爬蟲框架scr

用Python Scrapy取某電影網站並存mysql

爬取目標:javlib,使用框架Scrapy 首先使用在命令列裡scrapy startproject projectname和scrapy genspider spidername指令建立爬蟲。 首先定義items.pyimport scrapy class Av

【附上解釋】取A股所有上市公司的資訊並存到資料庫或者是csv檔案

輸入到mysql版 輸出會有警告,但是不影響。 附上了詳細的解釋~ import pandas as pd import requests import random from bs4 import BeautifulSoup import pymysql f

取貓眼top100電影並存在本地csv檔案

import requests from bs4 import BeautifulSoup import time import csv def getcontent(url): #網頁請求頭

scrapy取海量資料並存在MongoDBMySQL資料庫中

前言        一般我們都會將資料爬取下來儲存在臨時檔案或者控制檯直接輸出,但對於超大規模資料的快速讀寫,高併發場景的訪問,用資料庫管理無疑是不二之選。首先簡單描述一下MySQL和MongoDB的區別:MySQL與MongoDB都是開源的常用資料庫,MySQL是傳

使用selenium結合PhantomJS取淘寶美食並存到MongoDB

cnblogs exc cte ota browser -- pre command out PhantomJS是一種沒有界面的瀏覽器,便於爬蟲 1、PhantomJS下載 2、phantomjs無須安裝driver,還有具體的api參考: http://phantomj

Scrapy取豆瓣電影top250的電影數據、海報,MySQL

p地址 rom gin ani char 代碼 pipeline print 關閉數據庫 從GitHub得到完整項目(https://github.com/daleyzou/douban.git)1、成果展示數據庫本地海報圖片2、環境(1)已安裝Scrapy的Pycharm

scrapy 組合多個頁面的數據一並存

存儲 blank bsp 頁面 tps 信息 www quest ans 暫不重復,請看參考信息 參考: https://segmentfault.com/q/1010000009651745/a-1020000009652641 https://www.jianshu.

scrapy取京東商城某一類商品的資訊評論(二)

2、任務二:爬取商品評論資訊 如果不需要爬取使用者的地域資訊,那麼用這個網址爬就好: http://club.jd.com/review/10321370917-1-1-0.html 其中10321370917是商品的ID,評論的第一頁就是 -1-1-0.htm