iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
0
AI & Data

量化投資與機器學習研究系列 第 5

05.爬蟲工具scrapy用法

  • 分享至 

  • xImage
  •  

scrapy網路上有很多教學
scrapy的教學
scrapy的文件

分享一些重要的使用方法

不一定是最正確,但我習慣這樣設定,如果你遇到問題了可以參考看看

參數設定

最重要的參數
CONCURRENT_REQUESTS: 16
多線程調越小越好,不要把別人網站爬壞,如果被封ip就要換proxy了
我會先調1如果真的太慢才會慢慢調上去
如果是爬很多不同的網站,可以調高點但是
CONCURRENT_REQUESTS_PER_DOMAIN 還是設定1

最重要的參數
DOWNLOAD_DELAY: 0
延遲調越高越好,不要把別人網站爬壞,如果太低可能爬一段時間就爬不到資料,如果爬不到就一直往上加,有的還要調到10秒才爬得到

RETRY_TIMES: 2
預設的錯誤重試次數是2,有點少我會改多一點
'RETRY_TIMES': 5

RETRY_HTTP_CODES
Default: [500, 502, 503, 504, 408]
預設會重試有這些,會加上一些很常見的
'RETRY_HTTP_CODES': [400, 404, 500, 502, 503, 504, 408]

HTTPERROR_ALLOW_ALL : False
scrapy會自動忽略錯誤繼續執行下去,如果想要知道哪些網站錯誤,除了看log
也可以改成 True,把錯誤的也經過parse寫進去,之後再針對爬不到的重新爬取

COOKIES_ENABLED: True
如果這個網站可以不用cookies可以關掉,避免被發現爬蟲

ROBOTSTXT_OBEY = True
有的網站會叫你不要爬,scrapy就不會爬,改成False

客製化設定
通常一個scrapy project會有很多爬蟲
可以針對個別網站做設定覆蓋掉settings.py的設定,對應不同網站的反爬蟲

custom_settings = {
    'DOWNLOAD_DELAY': 1,
    'CONCURRENT_REQUESTS': 1,
    'MONGODB_COLLECTION': 'stock_day',
    'MONGODB_ITEM_CACHE': 1,
    'MONGODB_HAS_ID_FIELD': True,
    'MONGODB_UNIQ_KEY': [("date", -1), ("code", 1)],
    'COOKIES_ENABLED': False,
}

這個設定裡面的參數,很多是自定義的方法
自定義方法可以用crawler.settings.get方式讀取到設定

例如自定義的

class PyQueryMiddleware(object):
    def __init__(self, parser):
        self.parser = parser

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.get('PyQueryPARSER', None))

自定義的寫入mongodb

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(settings.get('MONGODB_SERVER', 'localhost'), settings.get('MONGODB_PORT', 27017),
                   settings.get('MONGODB_DB', None), settings.get('MONGODB_COLLECTION', None),
                   settings.get('MONGODB_UNIQ_KEY', None), settings.get('MONGODB_HAS_ID_FIELD', False),
                   settings.get('MONGODB_ITEM_CACHE', 1000), settings.get('MONGODB_DROP', False))

自定義方法
數字越小越優先,預設的UserAgentMiddleware只有一個,如果要自定每次都不同的UserAgent,如果不知道預設的優先順序可以設定成None關掉

DOWNLOADER_MIDDLEWARES = {
    'opendata.middlewares.PyQueryMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'opendata.middlewares.RandomUserAgent': 400,
}

可以省略
我是不寫item如果每個網站都要寫item會很累,有的一個網站要爬20幾個欄位,直接在parse傳出dict格式就好


上一篇
04.爬蟲工具
下一篇
06.爬蟲工具pyquery用法
系列文
量化投資與機器學習研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言