logo
Loading...

如何廻圈跑多次scrapy 爬蟲 - Cupoy

Day029 爬蟲我在main.py設一個list含兩個PTT看板,然後用FOR廻圈去分別爬兩個看板...

pycrawler,pycrawler-d29

如何廻圈跑多次scrapy 爬蟲

2020/01/07 上午 11:44
Python網路爬蟲討論版
簡崇哲
觀看數:34
回答數:6
收藏數:6
pycrawler
pycrawler-d29

Day029 爬蟲我在main.py設一個list含兩個PTT看板,然後用FOR廻圈去分別爬兩個看板,但第一看板爬完,第二個看板會失敗.

程式碼跟錯誤訊息如下,請教各位高手這問題要如何解,感謝.


1. main.py

def main():

    target_board = ['Tech_Job', 'Stock']

    process = CrawlerProcess(get_project_settings())

    for board in target_board:

        print("board : ", board)

        process.crawl('PTTCrawler', board=board)

        process.start()


if __name__ == '__main__':

    main()


2.  Error Msg:

['myproject.pipelines.JSONPipeline']

2020-01-07 11:39:30 [scrapy.core.engine] INFO: Spider opened

2020-01-07 11:39:30 [PTTCrawler] DEBUG: Create temp file for store JSON - C:\Users\chong\Desktop\Python\Python Marathon\Day029_Scrapy_PTT\Day029_Scrapy_PTT\myproject\crawled_data\.tmp.json.swp

2020-01-07 11:39:30 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

2020-01-07 11:39:30 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023

Traceback (most recent call last):

 File "main.py", line 33, in 

   main()

 File "main.py", line 30, in main

   process.start()

 File "C:\Users\chong\Anaconda3\lib\site-packages\scrapy\crawler.py", line 309, in start

reactor.run(installSignalHandlers=False)  # blocking call

 File "C:\Users\chong\Anaconda3\lib\site-packages\twisted\internet\base.py", line 1282, in run

   self.startRunning(installSignalHandlers=installSignalHandlers)

 File "C:\Users\chong\Anaconda3\lib\site-packages\twisted\internet\base.py", line 1262, in startRunning

   ReactorBase.startRunning(self)

 File "C:\Users\chong\Anaconda3\lib\site-packages\twisted\internet\base.py", line 765, in startRunning

   raise error.ReactorNotRestartable()

twisted.internet.error.ReactorNotRestartable

回答列表

  • 2020/01/08 上午 09:56
    張維元 (WeiYuan)
    贊同數:2
    不贊同數:0
    留言數:0

    嗨,你的 process.start() 要放在 for 迴圈的外面哦,從這篇討論來看,start() 只可以被呼叫一次。

  • 2020/01/08 下午 04:27
    葉碩涵
    贊同數:
    不贊同數:
    留言數:


    把process.start()放在外面後

    只會產生一個.json檔

    json檔裡面的內容是Gossiping跟Stock都有

    沒辦法分別產生兩個檔案

  • 2020/01/08 下午 04:46
    張維元 (WeiYuan)
    贊同數:1
    不贊同數:0
    留言數:1

    「把process.start()放在外面後 只會產生一個.json檔 json檔裡面的內容是Gossiping跟Stock都有 沒辦法分別產生兩個檔案」


    => 嗨,預設的 process 只會產生一個 json 檔案,你可以試試看多個「process」或是自己處理「匯出 JSON」這一段。 

  • 2020/01/09 上午 00:57
    張維元 (WeiYuan)
    贊同數:1
    不贊同數:0
    留言數:0

    「請問預設的process只會產生一個 json 檔案 這句話是指即使main裡有for迴圈跑兩個版 但他的跑法順序是 1.Gossiping open_spider 2.Stock open_spider 3.Gossiping close_spider 4.Stock close_spider 嗎? 所以後跑的Stock會把Gossiping蓋掉 因為他們在open_spider的取名是一樣的 都是.tmp.json.swp」


    => 我不確定後跑的會覆蓋過去還是繼續寫下去,可能要試一下才知道

  • 2020/01/10 下午 02:41
    小糖果
    贊同數:0
    不贊同數:0
    留言數:0

    請問,我已經把process.start() 放在 for 迴圈的外面,可是還是出現了一樣的error?請問是為什麼呢?謝謝您!