只有python可以爬虫吗_无所不能的Python之爬虫那点事儿
今天給大家介紹一個有趣的新技術——爬蟲。首先來講一下啥是爬蟲。
爬蟲也叫網絡爬蟲,是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。通俗的來講,爬蟲就是一段程序,它來根據你的設定自己去互聯網上瀏覽網頁并把這些信息下載下來,然后在從中提取出有用的信息。這些信息可以用在做數據分析、數據統計等等。
接下來我會用通俗的語言來講解爬蟲技術,這些都是基于我個人的理解所寫的,水平有限,若有不對的地方請指正。
我們平常瀏覽的眾多網站都是有對應的源代碼的。如果你有興趣,可以用你電腦的任意瀏覽器打開一個網站,然后按一下F12試試。此時你會看到:網頁里所有的文字、圖像、聲音等等一切元素,都是由HTML源碼編排而成。你打開的這個窗口其實就是網頁源碼的調試窗口,當你試著用鼠標在那些源碼上移動時,你會發現每移動到一個地方,網頁便會有對應的地方高亮起來。也就是說,當我們把這些被高亮的元素的源碼下載下來并解析出來,我們便獲取了這些元素。這便是爬蟲程序要干的事兒。
既然我們需要下載源碼,那我們首要的便是訪問這個網站。這里會出現一些問題:因為有些網站有反爬蟲技術,它會識別出你是爬蟲程序,并中斷你的訪問甚至是封鎖你的IP地址。這其中一個應對方法就是我們的爬蟲程序里一定要寫好HTTP請求頭。HTTP請求頭是當你正常用瀏覽器打開網頁時,瀏覽器向網絡服務器發送的一些配置信息和屬性。我們就是用這個HTTP請求頭來偽裝成人類訪問用戶,以防止被服務器屏蔽。
如何構造合理的 HTTP請求頭?
請求頭可以通過“requests”模塊自定義,例如
headers = {'User-Agent' :
'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D)'
' AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
headers = {'User-Agent': 'Chrome/68.0.3440.106',
'Accept-Encoding': 'gzip, deflate',
'Accept': '*/*',
'Connection': 'keep-alive',
'Content-Length': '18',
'Content-Type': 'application/x-www-form-urlencoded'}
經我親身測試發現,HTTP請求頭包含的這些內容里最為重要的是“User-Agent“這個參數。我們在設置請求頭時,其實只需要設置好它就足夠了。除了以上這個設置方法,還有一個較為簡單的辦法,那就是用python的fake_useragent模塊來設置,示例代碼如下:
#調用模塊的UserAgent類方法
from fake_useragent import UserAgent
#實例化類方法
user_agent = UserAgent()
#選擇chrome瀏覽器為User-Agent的值
headers = {'User-Agent':user_agent.chrome}
#選擇ie瀏覽器為User-Agent的值
headers = {'User-Agent':user_agent.ie}
#選擇firefox瀏覽器為User-Agent的值
headers = {'User-Agent':user_agent.firefox}
#隨機選擇一款瀏覽器為User-Agent的值
headers = {'User-Agent':user_agent.random}
請求頭設置完之后,我們便可以進行下一步關鍵性的操作——爬取指定網頁信息。
如何爬取指定網頁的信息?
這次我們用到了requests模塊中的get方法,requests.get(url , headers)。通過給get方法傳遞網址參數url和Http頭信息headers便可以接收到網站的響應response,這個response里包含著整個網頁的全部源代碼。這里我們應該在代碼中寫好各種可能發生的情況,以此來提高代碼運行時的穩定性,防止崩潰。示例代碼如下:
from requests.exceptions import ReadTimeout
try:
response = requests.get(url, headers=headers, timeout=0.5)
if response.status_code == 200:
return response.text
return 404
except ReadTimeout:
print('timeout')
except Exception as e:
print(e)
示例中用的是python的異常處理標識符——try、except。首先導入了requests模塊中的異常處理類型ReadTimeout,用來處理網站訪問超時響應問題。其次Exception用來處理其他常規的問題。然后在判斷response參數的status_code的值是否是200,這個值是200說明服務器響應成功了,如果不是,則返回404代碼。表示404 NotFound服務器響應失敗。到這一步,我們便完成了爬取網頁信息的工作,接下來就是從這些網頁代碼里分析和獲取有用信息。
如何從網頁源碼中獲取有用的信息?
這里我們會用到re模塊的兩個方法,一個是re.findall( 模式(正則表達式), 目標字符串),返回值為list類型,另一個是re.sub(要替換的字符,替換后字符,目標字符串,替換個數),返回值為str類型。re.findall函數是通過指定的正則表達式來匹配出需要的HTML源碼,一般情況下是匹配源碼中的div容器,也就是類似“
import re
response = """
太陽是太陽系的中心天體,占有太陽系總體質量的99.86%。 """partten = r'
([\s\S]*?)'data = re.findall(partten, response,)
print(data)
data_clean = re.sub(r'|', '', data[0])
print(data_clean)
輸出結果為
['太陽是太陽 系的中心天體,占有太陽系總體質量的99.86%。']
太陽是太陽系的中心天體,占有太陽系總體質量的99.86%。
第一行是findall函數的輸出結果。從內容上看,我們已經獲取了div容器里的內容,但是很明顯,這里面摻雜著其他的標記語言和。于是第二步sub函數將其中的和標簽替換成了空字符串。這行輸出結果便是我們所需要的有用信息。
下面我們來嘗試爬取京東官網的手機圖片,以下是源碼
import urllib.request
import re
from fake_useragent import UserAgent
import requests
from requests.exceptions import ReadTimeout
import os
user_agent = UserAgent()
headers = {
"User-Agent": user_agent.chrome,
}
def get_html(url, req=None):
if req:
url = url + req
else:
url = url
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
#print(response.text)
return response.text
return 404
except ReadTimeout:
print('timeout404')
except Exception as e:
print(e)
def get_request(response):
if response == 404:
return '服務器響應失敗!'
else:
try:
partten = r''
data = re.compile(partten).findall(response)
return data
except IndexError:
print('未搜到有用信息')
def output(data):
if not os.path.exists('texts'):
os.mkdir('texts')
for index, inf in enumerate(data):
image_url = 'https://' + inf
image_byte = requests.get(url=image_url, headers=headers).content
with open("./texts/{}.jpg".format(index),'wb') as f:
f.write(image_byte)
print('\n第{}張圖片已下載保存成功...'.format(index))
print('\n總共{}張圖片已成功下載至texts文件夾中'.format(len(data)))
def main(req):
url = 'https://list.jd.com/list.html?cat=9987,653,655&page='
html = get_html(url, req)
data = get_request(html)
output(data)
if __name__ == '__main__':
req = input('請輸入要下載的頁碼: ')
main(req)
程序運行之后,我們按照提示輸入頁碼,程序便開始下載圖片
下載完成之后,我們打開指定的文件夾查看一下效果
大功告成!
總結
以上是生活随笔為你收集整理的只有python可以爬虫吗_无所不能的Python之爬虫那点事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机二级考试c语言公共基础知识,全国计
- 下一篇: 北大暑期课作业 - 对cnblog 和其