學習心得:
1.課程講的十分詳細,對初學者來講是個不錯的選擇
2.wusir直播時講拉鉤登錄講了不少注意項,讓本身也發現了本身的錯誤點
3.alex雞湯太少了!!alex雞湯太少了!!alex雞湯太少了!!alex雞湯太少了!!css
4.做爲一個爬蟲初學者來講除了紮實得基礎外最主要得是學會如何使用爬蟲庫,集訓營得課程裏wusir講爬蟲庫講得十分詳細而且經過實例來讓咱們更加的深刻,這樣對於初學者來講是個很好的。能讓初學者少踩不少坑,也讓接觸過爬蟲同窗有了更加深刻得認知,對於可能會出錯得地方進行總結。拿拉鉤跟github來講網頁反爬得那個token可能不少初學者不懂得如何獲取跟寫入,在直播裏wusir用拉鉤作了例子詳細教咱們分析如何獲取跟使用讓咱們受益良多html
第三方庫---requests
1.安裝
pip install requests
注意使用python3時在linux系統下多是 pip3
2.requests部分經常使用參數
1.url 必填 須要訪問的網址
2.params 選填 發送請求的參數,有的URL已經拼接好不須要重複發送(GET請求)
3.data 選填 發送請求的參數,有的URL已經拼接好不須要重複發送(POST請求)
4.headers 選填 請求頭,有些網站必須驗證請求頭好比USER-AGENT
5.cookies 選填 用戶數據 有的網站會驗證是否登錄可使用cookie
補充:
1.post請求裏data爲 http請求裏的 body /r/n/r/n body
3.發送請求
1.get請求
response = requests.get(url='www.baidu.com',params={'例子':'例子'},headers={'host':'www.baidu.com')#發送請求
response.encoding = 'utf-8'#設定編碼
response.text #返回文本
2.post請求
response = requests.post(url='www.baidu.com',data={'例子':'例子'},headers={'host':'www.baidu.com')
....
第三方庫---beautifulsoup
1.安裝
pip install bs4
2.分析網頁
soup = BeautifulSoup(html,'lxml')#html爲請求後的text內容(html源碼),lxml爲解析庫
soup.find(name='標籤名',attrs={'id':'values'})#name標籤名,attrs標籤屬性
實例:模擬登錄github
#-*- coding: utf-8 -*-
# Author:w kpython
'''
1.訪問登錄頁面而且分析獲得authenticity_token
2.把附帶剛剛authenticity_token的cookie和帳號密碼參數POST請求
3.請求後獲取登錄的用戶名~
4.訪問用戶名的我的空間而且獲取信息
'''linux
import requests
from bs4 import BeautifulSoup
from config import *git
def login(username, password, token, cookies):
doc = BeautifulSoup(token, 'lxml')
token = doc.find(name='input', attrs={'name': 'authenticity_token'}).get('value')
data = {
"commit": "Sign+in",
"utf8": "✓",
"authenticity_token": token,
"login": username,
"password": password,
}
result = requests.post(url=LOGIN_URL, data=data, headers=HEADERS, cookies=cookies)
if result.status_code == 200 or 302:
# 若是返回的狀態嗎是200或者302則表明登錄成功,接着分析網頁獲取當前登錄的用戶名返回
status = BeautifulSoup(result.text, 'lxml')
user = status.find(name='strong', attrs={"class": "css-truncate-target"}).text
return user, result.cookies.get_dict()
return Nonegithub
def getPage(url, cookie=None, need_cookie=False):
'''
獲取頁面html代碼,有的網頁須要登錄因此能夠選擇是否傳入cookie
need_cookie能夠在獲取後返回cookie
:param url:
:param cookie:
:param need_cookie:
:return:
'''
try:
if cookie:
response = requests.get(url, cookies=cookie, headers=HEADERS)
else:
response = requests.get(url, headers=HEADERS)
if response.status_code == 200:
if need_cookie:
return response.text, response.cookies.get_dict()
return response.text
return None
except Exception as E:
print('請求失敗~')
return Nonecookie
def parseInformation(html):
'''
使用try能夠防止有的用戶沒有填寫那處的資料出錯
:param html:
:return:
'''
doc = BeautifulSoup(html, 'lxml')
nickname = doc.find(name='span', attrs={'itemprop': 'name'}).string
username = doc.find(name='span', attrs={'itemprop': 'additionalName'}).string網絡
try:
bio = doc.find(name='div', attrs={'class': 'd-inline-block mb-3 js-user-profile-bio-contents'}).div.string
except AttributeError:
bio = Nonepost
try:
company = doc.find(name='span', attrs={'class': 'p-org'}).div.string
except AttributeError:
company = None學習
try:
location = doc.find(name='span', attrs={'class': 'p-label'}).string
except AttributeError:
location = None
try:
email = doc.find(name='a', attrs={'class': 'u-email'}).string
except AttributeError:
email = None
try:
url = doc.find(name='a', attrs={'class': 'u-url'}).string
except AttributeError:
url = None
Information = '''=====用戶我的信息====
暱稱:{nickname}
用戶名:{username}
bio:{bio}
公司:{company}
位置:{location}
郵箱:{email}
網址:{url}
'''.format(nickname=nickname, username=username, bio=bio, company=company, location=location, email=email, url=url)
return Information
def main(user,pwd):
'''
程序入口:
先獲取登錄token,而後傳入帳號密碼和cookie,token登錄後訪問用戶主頁獲取用戶資料
:return:
'''
try:
result, cookie = getPage(url=TOKEN_URL, need_cookie=True)
except Exception:
print('沒法得到Token或者Cookie')
exit(-1)
result = login(username=user, password=pwd, token=result, cookies=cookie)
if result:
# result[0]爲用戶名,[1]爲cookie
user_url = 'https://github.com/' + result[0]
html = getPage(url=user_url, cookie=result[1])
if html:
information = parseInformation(html)
print(information)
else:
print('沒法解析我的空間頁面請重試')
exit(-1)
else:
print('登錄出錯,請檢查用戶名或者密碼或者網絡再從新嘗試~')
exit(-1)
if __name__ == '__main__': main(user,pwd)