用爬蟲竟然得到了所在學學同學的照片,還幫助哥們兒追其他系的女孩,
–引自 《python 3 網路爬蟲開發實戰》序言
1. 不會python怎么爬
聽別人說爬蟲,自己也一直想學學,苦于沒弄過python,一直沒有付諸行動,雖然通過別的語言也可以實作,總的原理就是獲取網頁內容、決議、存盤,但現在好像說爬蟲不用python就“不正宗”似的,
弄了本《python 3 網路爬蟲開發實戰》看看,在序言里就看到了這樣一段話,大概瀏覽了一下書的內容,覺得是不是可以不學python,直接開始配環境,裝框架,通過配置的方式達到目的, **畢竟不是想做python專職開發,**只是想“爬一爬”,通過學習爬蟲,順帶學一些python的知識,
不過一定要注意,不讓爬的一定不能爬,爬公開的內容也要注意,盡量降低頻率,像正常訪問一樣,別給人家服務器造成壓力,
2. 我也去大學爬點“風景”
作者爬過的大學我就不爬了,突然腦子里就冒出來了山大,那就去看看,在官網選單中大概瀏覽了一下,還真找到了,上地址:https://culture.sdu.edu.cn/sdyx/zxxq/17.htm

F12看一下HTML

結構比較簡單,非常符合作為菜鳥的我開始學習的樣例,
3. 安裝python環境
安裝環境及相關插件就全部采用最新版本吧,官網地址:https://www.python.org/
下載對應系統安裝包,本文以Windows下為例,目前最新版本為3.10.1

雙擊下載的python-3.10.1-amd64.exe檔案開始安裝,

勾選Add Python 3.10 to PATH, 添加對應的環境變數,
因為默認安裝在AppData,改一下,選擇Customize installation,進入下一步:

保持默認,繼續下一步,

修改安裝地址,點擊Install按鈕開始安裝,
4. 安裝Scrapy
Scrapy是適用于Python的一個快速、高層次的螢屏抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的資料,Scrapy用途廣泛,可以用于資料挖掘、監測和自動化測驗,
Scrapy吸引人的地方在于它是一個框架,任何人都可以根據需求方便的修改,它也提供了多種型別爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持,
4.1 安裝依賴
依次執行如下命令,安裝依賴,類似其他包管理器一樣
pip3 install lxml
pip3 install pyOpenSSL
pip3 install Twisted
pip3 install pyWin32
下載速度不快,慢慢等等安裝完成即可:

4.2 安裝Scrapy
通用采用pip3命令安裝:
pip3 install Scrapy

5. 創建Scrapy專案
執行scrapy startproject GetPhotos命令創建一個專案,名稱暫定為“GetPhotos”
F:\>scrapy startproject GetPhotos
New Scrapy project 'GetPhotos', using template directory 'C:\Python310\lib\site-packages\scrapy\templates\project', created in:
F:\GetPhotos
You can start your first spider with:
cd GetPhotos
scrapy genspider example example.com
創建成功,在當前目錄創建了一個以專案名名稱的檔案夾,并且給出了下一步的提示,
檔案內容如下:

里面還有個同名”GetPhotos“的檔案夾.
現在需要做一些配置性的作業,可以考慮用xcode打卡此目錄,方便修改檔案,(建議安裝python插件)
5.1 修改Item欄位
有個items.py檔案,帶如下
import scrapy
class GetphotosItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
我將它理解為Model,一個物體類貫穿全場,給他添加三個欄位
class GetphotosItem(scrapy.Item):
name = scrapy.Field()
time = scrapy.Field()
src = scrapy.Field()
分別用于存盤圖片的標題、時間和原始地址,
5.2 創建spider
進入專案目錄:
cd GetPhotos
創建spider
scrapy genspider GiveMePhotos culture.sdu.edu.cn

可以看到spiders檔案夾下多了一個名為GiveMePhotos.py的檔案,其內容如下
import scrapy
class GivemephotosSpider(scrapy.Spider):
name = 'GiveMePhotos'
allowed_domains = ['culture.sdu.edu.cn']
start_urls = ['http://culture.sdu.edu.cn/']
def parse(self, response):
pass
- name: spider的名稱
- allowed_domains: 允許爬的域名
- start_urls:起始地址
- parse方法:即處理請求結果的方法
start_urls肯定要改成我們的目標地址:https://culture.sdu.edu.cn/sdyx/zxxq/17.htm
然后就是分析這個網頁的元素,即parse方法,修改后的代碼如下
import scrapy
class GivemephotosSpider(scrapy.Spider):
name = 'GiveMePhotos'
allowed_domains = ['culture.sdu.edu.cn']
start_urls = ['https://culture.sdu.edu.cn/sdyx/zxxq/17.htm']
def parse(self, response):
ul = response.css('.case_list_ul').xpath('./li')
for li in ul:
item = Test1Item()
item['name'] = li.xpath('./div/span[1]/text()').extract_first()
item['time'] = li.xpath('./div/span[2]/text()').extract_first()
item['src'] = response.urljoin(li.xpath('./div/div/img/@data-original').extract_first())
yield item
如果用過jQuery應該很容易理解這段代碼,無非就是找到li標簽,回圈遍歷,然后再提取對應的節點,最終將決議的內容給item物體,
5.3 下載圖片
scrapy框架提供了相應的下載組件,如果不需要圖片處理,用普通的檔案下載FilesPipeline就行了,如果需要處理可以采用ImagessPipeline,這次只要下載就行了,修改pipelines.py檔案
from scrapy.pipelines.files import FilesPipeline
import scrapy
class GetphotosPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None, *, item=None):
#return request.url.split('/')[-1]
return item['name'] + ".jpg"
def get_media_requests(self, item, info):
yield scrapy.Request(item['src'])
代碼含義是:
- 定義一個GetphotosPipeline類,繼承自FilesPipeline
- 重寫file_path方法,這是一個用于指定檔案名的方法,可以通過Url截取,我試著用標題作為檔案名,
- 重寫get_media_requests方法,呼叫Request方法下載
5.4 專案配置
- 修改settings.py, 設定下載檔案存放目錄,
在settings.py中添加一行:
FILES_STORE = './imgs'
設定為子目錄imgs,
- 設定FilesPipeline
找到ITEM_PIPELINES節點,
ITEM_PIPELINES = {
'GetPhotos.pipelines.GetphotosPipeline': 300,
}
默認是用“#”號注釋掉的,去掉注釋,
6. 運行獲取結果
執行命令:
scrapy crawl GiveMePhotos
在命令視窗可以看到爬蟲啟動、獲取結果直到自動結束的程序,
專案目錄自動多了一個imgs檔案夾,如下圖

7. 總結
至此,一個簡要的爬蟲就完成了,雖然實作的功能比較簡單,但也可以說有一定的識訓,
- 大概熟悉了scrapy框架,它提供了好多現成的組件,
- 進一步了解了爬蟲的作業程序,為實作更復雜的功能打下基礎,
雖然是本文篇幅也不算太短了,但實際上大部分都是在做安裝配置的作業,實際上涉及python語法的都很少,
思考:如何自動翻頁下載下一頁呢?
注意:雖然是公開內容,但一定要慢慢爬,且此程序僅供學習,爬取內容不可作為其他用途,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384155.html
標籤:其他
