python爬蟲系列之初識爬蟲


前言

我們這里主要是利用requests模塊和bs4模塊進行簡單的爬蟲的講解,讓大家可以對爬蟲有了初步的認識,我們通過爬幾個簡單網站,讓大家循序漸進的掌握爬蟲的基礎知識,做網絡爬蟲還是需要基本的前端的知識的,下面我們進行我們的爬蟲講解

在進行實戰之前,我們先給大家看下爬蟲的一般討論,方便大家看懂下面的實例

一、爬汽車之家

汽車之家這個網站沒有做任何的防爬蟲的限制,所以最適合我們來練手

1、導入我們要用到的模塊

import requests
from bs4 import BeautifulSoup

  

2、利用requests模塊偽造瀏覽器請求

# 通過代碼偽造瀏覽器請求
res = requests.get("https://www.autohome.com.cn/news/")

  

3、設置解碼的方式,python是utf-8,但是汽車之家是用gbk編碼的,所以這里要設置一下解碼的方式

# 設置解碼的方式
res.encoding = "gbk"

  

4、把請求返回的對象,傳遞一個bs4模塊,生成一個BeautifulSoup對象

soup = BeautifulSoup(res.text,"html.parser")

  

5、這樣,我們就可以使用BeautifulSoup給我們提供的方法,如下是查找一個div標簽,且這個div標簽的id屬性為auto-channel-lazyload-atricle

# find是找到相匹配的第一個標簽
div = soup.find(name="div",attrs={"id":"auto-channel-lazyload-article"})
# 這個div是一個標簽對象

  

6、findall方法,是超找符合條件的所有的標簽,下面是在步驟5的div標簽內查找所有的li標簽

li_list = div.find_all(name="li")

  

7、查找li標簽中的不同條件的標簽

li_list = div.find_all(name="li")
for li in li_list:
    title = li.find(name="h3")
    neirong = li.find(name="p")
    href = li.find(name="a")
    img = li.find(name="img")
    if not title:
        continue

  

8、獲取標簽的屬性

    # print(title, title.text, sep="標題-->")
    # print(neirong, neirong.text, sep="內容-->")
    # print(href, href.attrs["href"], sep="超鏈接-->")

    # 獲取標簽對接的屬性
    # print(img.attrs["src"])
    # ret = requests.get(img_src)

  

9、如果我們下載一個文件,則需要requests.get這個文件,然后調用這個文件對象的content方法

    src = img.get("src")
    img_src = src.lstrip("/")
    file_name = img_src.split("/")[-1]
    img_src = "://".join(["https",img_src])
    print(file_name)
    ret = requests.get(img_src)
    with open(file_name,"wb") as f:
        f.write(ret.content)

  

10、整體的代碼如下

 

二、爬抽屜

這里我們看下如何爬抽屜

1、首先抽屜有做防爬蟲的機制,我們在訪問的時候必須要加一個請求頭

# 實例1:爬取數據,這個網址有做防爬蟲機制,所以需要帶一個請求頭信息,才能讓服務端以為我們是瀏覽器,不然服務端會把我們的請求當做爬蟲行為進行攔截
# 設置一個請求頭
chouti = requests.get(url="https://dig.chouti.com/",
                      headers={
                          "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      })

  

2、這個請求網站會返回一個cookies,通過下面的方法獲取cookies

print(chouti.cookies.get_dict())
# {'gpsd': 'ab141f7a741144216429b6e901da5f34', 'JSESSIONID': 'aaaNxWlWjLLKU9CGXDyNw'}

  

3、轉換頁面為一個BeautifulSoup對象

# 將頁面轉換成一個BeautifulSoup的對象,就可以使用BeautifulSoup的方法了
soup = BeautifulSoup(chouti.text,"html.parser")

news_list = soup.find_all(name="div",attrs={"class":"item"})

for news in news_list:
    compont = news.find(name="div",attrs={"class":"part2"})

    print(compont.get("share-title"))

 

 

 

4、下面我們看下如何登陸抽屜

首先我們先通過get方式訪問主頁

# 1、先查看首頁
r1 = requests.get(url="https://dig.chouti.com/",
                      headers={
                          "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      })

  

然后我們通過post方式進行登陸,

# 2、提交用戶名和密碼進行登陸

r2 = requests.post(url="https://dig.chouti.com/login",
              headers={
                    "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
              },
              data={
                  "phone":"86139252938822",
                  "password":"admin",
                  "oneMonth":1
              },
              cookies=r1.cookies.get_dict()
              )

  

 

最后登陸成功后,我們來實現一個點贊的操作,這里要注意

# 第二次登陸的時候把第一次返回的cookies帶上,這個是抽屜這個網站的套路,同樣這次登陸也會返回一個cookies,但是登陸這次返回的cookies其實是個迷惑我們的cookies,沒有用
# print(r2.text)
# 登陸失敗返回的信息:{"result":{"code":"21101", "message":"手機號或密碼錯誤", "data":{}}}
# 登陸成功返回的信息:{"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_53218132468"}}}

# 如果登陸成功,通過下面的方法就可以把服務端返回的cookies拿到,以后在發請求,帶着cookies去就可以了
print(r2.cookies.get_dict())
# {'puid': 'b11ec95d3b515ae2677a01f6abd5b916', 'gpid': '01cff9a184bd427789429d1dd556f4d2'}

r3 = requests.post(url="https://dig.chouti.com/link/vote?linksId=25461201",
                    headers={
                        "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                    },
                   # cookies=r2.cookies.get_dict(),
                   cookies=r1.cookies.get_dict(),
                   # 破解抽屜coookies套路
                   )
# 這次點贊,我們同樣帶的cookies是第一次登陸主頁返回的cookies,而不是登陸成功后返回的cookies
# print(r3.text)

  

 

 

 爬抽屜所有的代碼如下

# 實例1:爬取數據,這個網址有做防爬蟲機制,所以需要帶一個請求頭信息,才能讓服務端以為我們是瀏覽器,不然服務端會把我們的請求當做爬蟲行為進行攔截

# 設置一個請求頭
chouti = requests.get(url="https://dig.chouti.com/",
                      headers={
                          "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      })

# print(chouti.text)

print(chouti.cookies.get_dict())
# {'gpsd': 'ab141f7a741144216429b6e901da5f34', 'JSESSIONID': 'aaaNxWlWjLLKU9CGXDyNw'}

# 將頁面轉換成一個BeautifulSoup的對象,就可以使用BeautifulSoup的方法了
soup = BeautifulSoup(chouti.text,"html.parser")

news_list = soup.find_all(name="div",attrs={"class":"item"})

for news in news_list:
    compont = news.find(name="div",attrs={"class":"part2"})

    print(compont.get("share-title"))



# 1、先查看首頁
r1 = requests.get(url="https://dig.chouti.com/",
                      headers={
                          "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      })

# r1.cookies.get_dict(),第一次訪問主頁,服務端就給返回了一個cookies

# 2、提交用戶名和密碼進行登陸

r2 = requests.post(url="https://dig.chouti.com/login",
              headers={
                    "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
              },
              data={
                  "phone":"8613925293887",
                  "password":"admin123.",
                  "oneMonth":1
              },
              cookies=r1.cookies.get_dict()
              )


# 第二次登陸的時候把第一次返回的cookies帶上,這個是抽屜這個網站的套路,同樣這次登陸也會返回一個cookies,但是登陸這次返回的cookies其實是個迷惑我們的cookies,沒有用
# print(r2.text)
# 登陸失敗返回的信息:{"result":{"code":"21101", "message":"手機號或密碼錯誤", "data":{}}}
# 登陸成功返回的信息:{"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_53218132468"}}}

# 如果登陸成功,通過下面的方法就可以把服務端返回的cookies拿到,以后在發請求,帶着cookies去就可以了
print(r2.cookies.get_dict())
# {'puid': 'b11ec95d3b515ae2677a01f6abd5b916', 'gpid': '01cff9a184bd427789429d1dd556f4d2'}

r3 = requests.post(url="https://dig.chouti.com/link/vote?linksId=25461201",
                    headers={
                        "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                    },
                   # cookies=r2.cookies.get_dict(),
                   cookies=r1.cookies.get_dict(),
                   # 破解抽屜coookies套路
                   )
# 這次點贊,我們同樣帶的cookies是第一次登陸主頁返回的cookies,而不是登陸成功后返回的cookies
# print(r3.text)

  

三、爬github

 github的登陸是form表單做的,所以我們在登陸github的時候需要把cookies和crsf_token都帶上

1、訪問github的首頁

# 1、GET,訪問登陸頁面

r1 = requests.get(url="https://github.com/",
                  headers={
                      "user-agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      }
                  )
# print(r1.cookies.get_dict())

  

2、訪問登陸頁面,需要在隱藏的input標簽中找到token,然后獲取到

r2 = requests.get(url="https://github.com/login",
                  headers={
                          "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      }
                  )

login_obj = BeautifulSoup(r2.text,"html.parser")

token = login_obj.find(name="form",attrs={"action":"/session"}).find(name="input",attrs={"name":"authenticity_token"}).get("value")

  

 

 3、post方式訪問登陸頁面,攜帶上用戶名和密碼,token和cookies

# 2、發送post請求,發送用戶名和密碼,發送的數據要不僅有用戶名和密碼,還要帶上csrf token和cookie,瀏覽器發什么,我們就發什么
r3 = requests.post(url="https://github.com/session",
                  headers={
                          "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                      },
                   data={
                       "login":"admin",
                       "password":"admin",
                       "authenticity_token":token
                   },
                    cookies=r2.cookies.get_dict()
                  )

  

4、以后就可以攜帶r3這個請求訪問的cookies進行登陸github后的操作了

obj = BeautifulSoup(r3.text,"html.parser")

# print(obj.find_all(name="img",attrs={"alt":"@admin"}))

# 3、發送get請求,訪問這個路徑:https://github.com/settings/profile

r4 = requests.get(url="https://github.com/settings/profile",
             cookies=r3.cookies.get_dict()
             )

print(r4.text)

  

爬github的所有的代碼如下

 

四、爬拉鈎網

最后我們來爬一下拉勾網

1、首先get方式訪問拉勾網的首頁

import requests
from bs4 import BeautifulSoup

# 如果遇到登陸的密碼被加密了有兩種解決辦法
# 1、獲取他的加密方式,然后手動破解
# 2、直接抓包把加密后的數據發過去就可以了

# 1、訪問登陸頁面
l1 = requests.get(url="https://passport.lagou.com/login/login.html",
                  headers={
                      "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
                  })

# print(l1.text)

  

2、登陸拉鈎網,他的請求頭稍微有點特殊

 

data很簡單,我們直接抓包就可以拿到

主要是請求頭中的數據是怎么來的,下面這2個是在我們請求登陸的頁面中返回的,由於這2項在script標簽中,我們只能通過正則表達式來匹配獲取

 

 

 

 

 

最后是爬拉勾網的所有的代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM