日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

只有python可以爬虫吗_无所不能的Python之爬虫那点事儿

發(fā)布時間:2024/7/23 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 只有python可以爬虫吗_无所不能的Python之爬虫那点事儿 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天給大家介紹一個有趣的新技術——爬蟲。首先來講一下啥是爬蟲。

爬蟲也叫網(wǎng)絡爬蟲,是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。通俗的來講,爬蟲就是一段程序,它來根據(jù)你的設定自己去互聯(lián)網(wǎng)上瀏覽網(wǎng)頁并把這些信息下載下來,然后在從中提取出有用的信息。這些信息可以用在做數(shù)據(jù)分析、數(shù)據(jù)統(tǒng)計等等。

接下來我會用通俗的語言來講解爬蟲技術,這些都是基于我個人的理解所寫的,水平有限,若有不對的地方請指正。

我們平常瀏覽的眾多網(wǎng)站都是有對應的源代碼的。如果你有興趣,可以用你電腦的任意瀏覽器打開一個網(wǎng)站,然后按一下F12試試。此時你會看到:網(wǎng)頁里所有的文字、圖像、聲音等等一切元素,都是由HTML源碼編排而成。你打開的這個窗口其實就是網(wǎng)頁源碼的調(diào)試窗口,當你試著用鼠標在那些源碼上移動時,你會發(fā)現(xiàn)每移動到一個地方,網(wǎng)頁便會有對應的地方高亮起來。也就是說,當我們把這些被高亮的元素的源碼下載下來并解析出來,我們便獲取了這些元素。這便是爬蟲程序要干的事兒。

既然我們需要下載源碼,那我們首要的便是訪問這個網(wǎng)站。這里會出現(xiàn)一些問題:因為有些網(wǎng)站有反爬蟲技術,它會識別出你是爬蟲程序,并中斷你的訪問甚至是封鎖你的IP地址。這其中一個應對方法就是我們的爬蟲程序里一定要寫好HTTP請求頭。HTTP請求頭是當你正常用瀏覽器打開網(wǎng)頁時,瀏覽器向網(wǎng)絡服務器發(fā)送的一些配置信息和屬性。我們就是用這個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'}

經(jīng)我親身測試發(fā)現(xiàn),HTTP請求頭包含的這些內(nèi)容里最為重要的是“User-Agent“這個參數(shù)。我們在設置請求頭時,其實只需要設置好它就足夠了。除了以上這個設置方法,還有一個較為簡單的辦法,那就是用python的fake_useragent模塊來設置,示例代碼如下:

#調(diào)用模塊的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}

請求頭設置完之后,我們便可以進行下一步關鍵性的操作——爬取指定網(wǎng)頁信息。

如何爬取指定網(wǎng)頁的信息?

這次我們用到了requests模塊中的get方法,requests.get(url , headers)。通過給get方法傳遞網(wǎng)址參數(shù)url和Http頭信息headers便可以接收到網(wǎng)站的響應response,這個response里包含著整個網(wǎng)頁的全部源代碼。這里我們應該在代碼中寫好各種可能發(fā)生的情況,以此來提高代碼運行時的穩(wěn)定性,防止崩潰。示例代碼如下:

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,用來處理網(wǎng)站訪問超時響應問題。其次Exception用來處理其他常規(guī)的問題。然后在判斷response參數(shù)的status_code的值是否是200,這個值是200說明服務器響應成功了,如果不是,則返回404代碼。表示404 NotFound服務器響應失敗。到這一步,我們便完成了爬取網(wǎng)頁信息的工作,接下來就是從這些網(wǎng)頁代碼里分析和獲取有用信息。

如何從網(wǎng)頁源碼中獲取有用的信息?

這里我們會用到re模塊的兩個方法,一個是re.findall( 模式(正則表達式), 目標字符串),返回值為list類型,另一個是re.sub(要替換的字符,替換后字符,目標字符串,替換個數(shù)),返回值為str類型。re.findall函數(shù)是通過指定的正則表達式來匹配出需要的HTML源碼,一般情況下是匹配源碼中的div容器,也就是類似“

import re

response = """

太陽是太陽系的中心天體,占有太陽系總體質(zhì)量的99.86%。 """

partten = r'

([\s\S]*?)'

data = re.findall(partten, response,)

print(data)

data_clean = re.sub(r'|', '', data[0])

print(data_clean)

輸出結果為

['太陽是太陽 系的中心天體,占有太陽系總體質(zhì)量的99.86%。']

太陽是太陽系的中心天體,占有太陽系總體質(zhì)量的99.86%。

第一行是findall函數(shù)的輸出結果。從內(nèi)容上看,我們已經(jīng)獲取了div容器里的內(nèi)容,但是很明顯,這里面摻雜著其他的標記語言和。于是第二步sub函數(shù)將其中的和標簽替換成了空字符串。這行輸出結果便是我們所需要的有用信息。

下面我們來嘗試爬取京東官網(wǎng)的手機圖片,以下是源碼

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之爬虫那点事儿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。