第一次scrapy爬虫记录
一、說明
最近心血來潮想學一下爬蟲,簡單看了些速成視頻,用scrapy從一些結構簡單的網站上爬了一些數據下來,這里記錄一下步驟。
下圖是把人家的ip扒下來了。
二、環境準備(下載pycharm,創建scrapy項目)
我是在Windows上弄的,首先下一個pycharm,然后創建一個項目,項目名一般是取要爬的網站的域名+Spider,這個沒什么規定,只是習慣,比如說要爬這個網址:
https://www.kuaidaili.com/free/
項目名就取 kuaidailiSpider 吧:
然后 import scrapy 讓pycharm幫忙把環境準備一下:
裝好之后,進入項目根目錄:
venv\Scripts這個目錄里面有 scrapy.exe ,復制一下這個路徑,回到項目根目錄(main.py所在的位置),打開終端:
通過相對路徑運行 scrapy.exe 創建一個 scrapy 項目:
./venv/Scripts/scrapy.exe startproject kuaidailiSpider創建好項目之后,在pycharm里可以看到文件結構的變化:
到現在為止,scrapy項目就創建好了。
三、創建spider類
終端中進入 kuaidailiSpider 目錄,里面應該有一個 cfg 文件的:
在這個有 cfg 文件的目錄下執行下面的命令來創建一個 spider 類:
../venv/Scripts/scrapy.exe genspider kuaidaili kuaidaili.com這個命令的意思是生成 spider 類,類名是 kuaidaili ,爬取路徑是 kuaidaili.com.
執行成功后發現 spider 目錄下多了一個文件 kuaidaili.py
接下來的爬蟲代碼基本都在這里完成,但是在此之前先要完成一些其他設置。
四、修改設置文件
修改 settings.py,把遵守規則改成false:
因為如果遵守規則,可能什么都爬不到,只能鋌而走險啦!
然后在請求頭這里,取消注釋,然后加一個 user-agent,這個 user-agent 你可以去瀏覽器上按F12,然后刷新網頁,從 network 那里找一個網頁,把它的 user-agent 復制過來:
這里就是說,默認是沒有請求頭的,我們加一個,偽裝成 chrome 瀏覽器,這樣網站就以為我們是人了。
但是我們也不是壞人,為了不把網站搞爆,出于良心,我把延時加上了,這個你也可以不加:
準備工作做完啦!
五、編寫爬蟲代碼(爬取第一個頁面)
打開爬蟲文件,默認模板是這樣的:
parse 函數是每次下載網頁之后的回調函數,我們在這里寫代碼。首先回到瀏覽器,把鼠標放在想要觀察的ip這里,右鍵點檢查,觀察HTML結構:
發現是一個 tr 里面有很多 td,我們只需遍歷所有 tr 再遍歷里面的 td 就行了,這里涉及 xpath 語法,我也不懂,反正我是照著視頻的代碼改的:
注意 start_urls 是開始爬取的頁面,這里改成:
start_urls = ['http://kuaidaili.com/free']
寫好了,然后回到終端,輸入這個命令開始爬蟲:
../venv/Scripts/scrapy.exe crawl kuaidaili這樣就算是把第一個頁面爬好了,我們可以把這些數據存到數據庫或者磁盤上。
六、翻頁爬取
如果想翻頁咋辦呢,我們研究一下翻頁對url的影響,發現規律如下:
https://www.kuaidaili.com/free/inha/1/ https://www.kuaidaili.com/free/inha/2/ https://www.kuaidaili.com/free/inha/3/ ...后面的數字表示頁碼。
右鍵檢查,由于沒有下一頁按鈕,所以只能通過 active 類找到當前頁面,然后 +1 了。
class 是 active,我們可以通過 xpath 獲取 href,這里就照貓畫虎,我也懶得學這個 xpath,xpath 是這樣子的:
//a[@class="active"]/@href最終代碼是這樣的,如果運行爆503錯誤,就是被反爬了,解決方案就是修改 settings 文件,加 user-agent,加延時,關閉 obey。
import scrapyclass KuaidailiSpider(scrapy.Spider):name = 'kuaidaili'allowed_domains = ['kuaidaili.com']start_urls = ['http://kuaidaili.com/free']def parse(self, response):selectors = response.xpath("//tr") # 選擇所有tr標簽# 遍歷tr標簽下的td標簽for selector in selectors:ip = selector.xpath("./td[1]/text()").get()port = selector.xpath("./td[2]/text()").get()print(ip, port)# 翻頁,每個網站不一樣,我測試的 Kuaidaili 就沒有下一頁current_page = response.xpath('//a[@class="active"]/@href').get()print(current_page)current_page_id = int(current_page[current_page[:-1].rfind("/") + 1:-1])print(current_page_id)if current_page and current_page_id < 3:current_url = response.urljoin(current_page)next_url = current_url[:current_url[:-1].rfind("/") + 1] + str((int(current_url[current_url[:-1].rfind("/") + 1:-1]) + 1)) + "/"print(next_url)# 頁碼+1得到下一頁# 發出請求yield scrapy.Request(next_url, callback=self.parse)print("----------------------------------------------------------------\n\n\n")運行爬蟲要用 crawl 參數,如下圖:
../venv/Scripts/scrapy.exe crawl kuaidaili總結
以上是生活随笔為你收集整理的第一次scrapy爬虫记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FileLocatorPro正则表达式批
- 下一篇: 第二次爬虫,更加熟练啦