明明半個(gè)小時(shí)就可以手動(dòng)下載,卻非要花一個(gè)小時(shí)寫一個(gè)爬蟲(/手動(dòng)狗頭)
引子
學(xué)習(xí)java web部署的時(shí)候找到一個(gè)網(wǎng)站齐邦,這個(gè)網(wǎng)站有一些部署java項(xiàng)目的配置文件,下載就直接可以用怨绣,并且還有不少值得學(xué)習(xí)的資料探膊,所以就想把這個(gè)網(wǎng)站的文件下載下來,網(wǎng)站的文件還是有點(diǎn)多的利朵,并且這個(gè)網(wǎng)站下載速度很慢,手動(dòng)點(diǎn)擊下載的話非常慢绍弟,所以就想寫一個(gè)爬蟲幫助我下載文件技即,
分析網(wǎng)站
網(wǎng)站是一個(gè)典型的FTP站點(diǎn),如圖:
該ftp網(wǎng)站中有文件也有文件夾樟遣,爬取時(shí)需要判斷是文件還是文件夾而叼,并且在本地創(chuàng)建相同的目錄結(jié)構(gòu)身笤。a標(biāo)簽下有文件的地址以及目錄跳轉(zhuǎn)鏈接
看網(wǎng)站中所有的a標(biāo)簽就是我們需要的鏈接地址,以/
結(jié)尾的是文件夾地址葵陵,其他的就直接是需要爬取的文件液荸。另外文件的地址href標(biāo)簽都被參數(shù)化,不方便建立文件夾脱篙,將被參數(shù)化后的部分替換為text娇钱,發(fā)現(xiàn)也是可以直接訪問的,
http://learning.happymmall.com/QQ%E5%AD%A6%E4%B9%A0%E7%BE%A4%E5%A4%A7%E5%AE%B6%E5%85%B1%E4%BA%AB%E7%9A%84useful%E6%96%87%E6%A1%A3/Intellij%20IDEA%E6%95%99%E7%A8%8B.pdf
轉(zhuǎn)為
http://learning.happymmall.com/QQ學(xué)習(xí)群大家共享的useful文檔/Intellij IDEA教程.pdf
需要在本地建立與網(wǎng)站相同目錄的文件夾绊困,將上面URL以/
進(jìn)行split分割文搂,取[3:-1]
位置的即為需要建立的文件夾名。
有了文件夾后即可通過requests
庫進(jìn)行文件遞歸爬取秤朗。
代碼
- 首先引入需要的包
# -*- coding: utf-8 -*-
# @Author : hejiahao
# @Time : 2019/4/6 下午2:12
# @Software: PyCharm
# @File : mmall.py
from pyquery import PyQuery as pq
import requests
import os
- 要爬取的網(wǎng)站地址
base_url = 'http://learning.happymmall.com/'
- 根據(jù)URL以及目錄下載文件
def get_file(url, path):
if os.path.exists(path):
print('文件已經(jīng)存在: ', path)
else:
response = requests.get(url)
with open(path, 'wb') as f:
f.write(response.content)
f.close()
print('下載完成: ', path)
- 遞歸爬取文件煤蹭,注意要去除
./
和../
這兩個(gè)目錄
def get_url(page_url):
doc = pq(url=page_url)
# response = requests.get(url)
a_links = doc.find('a')
hrefs = []
for a in a_links.items():
href = a.attr('href')
name = a.text()
if href == '../' or href == './':
continue
else:
if href[-1] == '/':
new_url = os.path.join(page_url, name)
dirs = new_url.split('/')[3:-1]
dir = '/'.join(dirs)
if os.path.exists(dir)==False:
os.makedirs(dir)
get_url(new_url)
else:
path = os.path.join(page_url, name)
name = path[31:]
get_file(path, name)
# print(os.path.join(page_url, href))
- 運(yùn)行程序
get_url(base_url)
print('success')
到此為止所有的文件已經(jīng)爬取到我們自己的電腦上面了,下面是代碼和爬取下來的文件結(jié)構(gòu)取视,done.
代碼比較短疯兼,就不上傳github
了,把上面五部分全部復(fù)制下來即可贫途。
從開始提出想法到寫完代碼不到一個(gè)小時(shí)吧彪,還有很多需要改進(jìn)的地方,例如在爬取的時(shí)候可以用異步方法加速爬取丢早,這個(gè)網(wǎng)站比較簡單姨裸,沒有反爬策略,如果有反爬的話還需要考慮加代理怨酝。