這篇文章主要為大家展示了“python如何實(shí)現(xiàn)爬蟲(chóng)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“python如何實(shí)現(xiàn)爬蟲(chóng)”這篇文章吧。
目前創(chuàng)新互聯(lián)公司已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、海南州網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。一、爬汽車(chē)之家
汽車(chē)之家這個(gè)網(wǎng)站沒(méi)有做任何的防爬蟲(chóng)的限制,所以最適合我們來(lái)練手
1、導(dǎo)入我們要用到的模塊
import requests from bs4 import BeautifulSoup
2、利用requests模塊偽造瀏覽器請(qǐng)求
# 通過(guò)代碼偽造瀏覽器請(qǐng)求 res = requests.get(https://www.autohome.com.cn/news/)
3、設(shè)置解碼的方式,python是utf-8,但是汽車(chē)之家是用gbk編碼的,所以這里要設(shè)置一下解碼的方式
# 設(shè)置解碼的方式 res.encoding = "gbk"
4、把請(qǐng)求返回的對(duì)象,傳遞一個(gè)bs4模塊,生成一個(gè)BeautifulSoup對(duì)象
soup = BeautifulSoup(res.text,"html.parser")
5、這樣,我們就可以使用BeautifulSoup給我們提供的方法,如下是查找一個(gè)div標(biāo)簽,且這個(gè)div標(biāo)簽的id屬性為auto-channel-lazyload-atricle
# find是找到相匹配的第一個(gè)標(biāo)簽 div = soup.find(name="div",attrs={"id":"auto-channel-lazyload-article"}) # 這個(gè)div是一個(gè)標(biāo)簽對(duì)象
6、findall方法,是超找符合條件的所有的標(biāo)簽,下面是在步驟5的div標(biāo)簽內(nèi)查找所有的li標(biāo)簽
li_list = div.find_all(name="li")
7、查找li標(biāo)簽中的不同條件的標(biāo)簽
li_list = div.find_all(name="li") for li in li_list: title = li.find(name="h4") neirong = li.find(name="p") href = li.find(name="a") img = li.find(name="img") if not title: continue
8、獲取標(biāo)簽的屬性
# print(title, title.text, sep="標(biāo)題-->") # print(neirong, neirong.text, sep="內(nèi)容-->") # print(href, href.attrs["href"], sep="超鏈接-->") # 獲取標(biāo)簽對(duì)接的屬性 # print(img.attrs["src"]) # ret = requests.get(img_src)
9、如果我們下載一個(gè)文件,則需要requests.get這個(gè)文件,然后調(diào)用這個(gè)文件對(duì)象的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、首先抽屜有做防爬蟲(chóng)的機(jī)制,我們?cè)谠L問(wèn)的時(shí)候必須要加一個(gè)請(qǐng)求頭
# 實(shí)例1:爬取數(shù)據(jù),這個(gè)網(wǎng)址有做防爬蟲(chóng)機(jī)制,所以需要帶一個(gè)請(qǐng)求頭信息,才能讓服務(wù)端以為我們是瀏覽器,不然服務(wù)端會(huì)把我們的請(qǐng)求當(dāng)做爬蟲(chóng)行為進(jìn)行攔截 # 設(shè)置一個(gè)請(qǐng)求頭 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、這個(gè)請(qǐng)求網(wǎng)站會(huì)返回一個(gè)cookies,通過(guò)下面的方法獲取cookies
print(chouti.cookies.get_dict()) # {'gpsd': 'ab141f7a741144216429b6e901da5f34', 'JSESSIONID': 'aaaNxWlWjLLKU9CGXDyNw'}
3、轉(zhuǎn)換頁(yè)面為一個(gè)BeautifulSoup對(duì)象
# 將頁(yè)面轉(zhuǎn)換成一個(gè)BeautifulSoup的對(duì)象,就可以使用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、下面我們看下如何登陸抽屜
首先我們先通過(guò)get方式訪問(wèn)主頁(yè)
# 1、先查看首頁(yè) 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" })
然后我們通過(guò)post方式進(jìn)行登陸,
# 2、提交用戶(hù)名和密碼進(jìn)行登陸 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() )
最后登陸成功后,我們來(lái)實(shí)現(xiàn)一個(gè)點(diǎn)贊的操作,這里要注意
# 第二次登陸的時(shí)候把第一次返回的cookies帶上,這個(gè)是抽屜這個(gè)網(wǎng)站的套路,同樣這次登陸也會(huì)返回一個(gè)cookies,但是登陸這次返回的cookies其實(shí)是個(gè)迷惑我們的cookies,沒(méi)有用 # print(r2.text) # 登陸失敗返回的信息:{"result":{"code":"21101", "message":"手機(jī)號(hào)或密碼錯(cuò)誤", "data":{}}} # 登陸成功返回的信息:{"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_53218132468"}}} # 如果登陸成功,通過(guò)下面的方法就可以把服務(wù)端返回的cookies拿到,以后在發(fā)請(qǐng)求,帶著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套路 ) # 這次點(diǎn)贊,我們同樣帶的cookies是第一次登陸主頁(yè)返回的cookies,而不是登陸成功后返回的cookies # print(r3.text)
爬抽屜所有的代碼如下
# 實(shí)例1:爬取數(shù)據(jù),這個(gè)網(wǎng)址有做防爬蟲(chóng)機(jī)制,所以需要帶一個(gè)請(qǐng)求頭信息,才能讓服務(wù)端以為我們是瀏覽器,不然服務(wù)端會(huì)把我們的請(qǐng)求當(dāng)做爬蟲(chóng)行為進(jìn)行攔截 # 設(shè)置一個(gè)請(qǐng)求頭 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'} # 將頁(yè)面轉(zhuǎn)換成一個(gè)BeautifulSoup的對(duì)象,就可以使用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、先查看首頁(yè) 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(),第一次訪問(wèn)主頁(yè),服務(wù)端就給返回了一個(gè)cookies # 2、提交用戶(hù)名和密碼進(jìn)行登陸 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() ) # 第二次登陸的時(shí)候把第一次返回的cookies帶上,這個(gè)是抽屜這個(gè)網(wǎng)站的套路,同樣這次登陸也會(huì)返回一個(gè)cookies,但是登陸這次返回的cookies其實(shí)是個(gè)迷惑我們的cookies,沒(méi)有用 # print(r2.text) # 登陸失敗返回的信息:{"result":{"code":"21101", "message":"手機(jī)號(hào)或密碼錯(cuò)誤", "data":{}}} # 登陸成功返回的信息:{"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_53218132468"}}} # 如果登陸成功,通過(guò)下面的方法就可以把服務(wù)端返回的cookies拿到,以后在發(fā)請(qǐng)求,帶著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套路 ) # 這次點(diǎn)贊,我們同樣帶的cookies是第一次登陸主頁(yè)返回的cookies,而不是登陸成功后返回的cookies # print(r3.text)
三、爬github
github的登陸是form表單做的,所以我們?cè)诘顷慻ithub的時(shí)候需要把cookies和crsf_token都帶上
1、訪問(wèn)github的首頁(yè)
# 1、GET,訪問(wèn)登陸頁(yè)面 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、訪問(wèn)登陸頁(yè)面,需要在隱藏的input標(biāo)簽中找到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方式訪問(wèn)登陸頁(yè)面,攜帶上用戶(hù)名和密碼,token和cookies
# 2、發(fā)送post請(qǐng)求,發(fā)送用戶(hù)名和密碼,發(fā)送的數(shù)據(jù)要不僅有用戶(hù)名和密碼,還要帶上csrf token和cookie,瀏覽器發(fā)什么,我們就發(fā)什么 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這個(gè)請(qǐng)求訪問(wèn)的cookies進(jìn)行登陸github后的操作了
obj = BeautifulSoup(r3.text,"html.parser") # print(obj.find_all(name="img",attrs={"alt":"@admin"})) # 3、發(fā)送get請(qǐng)求,訪問(wèn)這個(gè)路徑:https://github.com/settings/profile r4 = requests.get(url="https://github.com/settings/profile", cookies=r3.cookies.get_dict() ) print(r4.text)
爬github的所有的代碼如下
四、爬拉鉤網(wǎng)
最后我們來(lái)爬一下拉勾網(wǎng)
1、首先get方式訪問(wèn)拉勾網(wǎng)的首頁(yè)
import requests from bs4 import BeautifulSoup # 如果遇到登陸的密碼被加密了有兩種解決辦法 # 1、獲取他的加密方式,然后手動(dòng)破解 # 2、直接抓包把加密后的數(shù)據(jù)發(fā)過(guò)去就可以了 # 1、訪問(wèn)登陸頁(yè)面 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、登陸拉鉤網(wǎng),他的請(qǐng)求頭稍微有點(diǎn)特殊
data很簡(jiǎn)單,我們直接抓包就可以拿到
主要是請(qǐng)求頭中的數(shù)據(jù)是怎么來(lái)的,下面這2個(gè)是在我們請(qǐng)求登陸的頁(yè)面中返回的,由于這2項(xiàng)在script標(biāo)簽中,我們只能通過(guò)正則表達(dá)式來(lái)匹配獲取
最后是爬拉勾網(wǎng)的所有的代碼
以上是“python如何實(shí)現(xiàn)爬蟲(chóng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!