#方法一:直接使用coookies登錄,此方法須要提早在瀏覽器中使用帳號密碼登錄後,獲取瀏覽器中的cookies,在構造的請求中攜帶這個cookies(缺點是有時效性)。php
#方法二:經過帳號密碼(From data)登錄,在登錄後得到其中的cookies,以後的對須要登錄的頁面操做,只須要攜帶這個cookies便可html
1 #如下代碼是利用方法1 2 # -*- coding: utf-8 -*- 3 import requests; 4 import sys; 5 import io; 6 #重點:標準解析庫 7 from bs4 import BeautifulSoup; 8 sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8'); #改變標準輸出的默認編碼 9 #根據cookies訪問後臺 10 url = 'http://域名/other/other.comment.wall.php?ac=l&id=&fid=&uid=&title=&source=0&status=0&b_time=&e_time='; 11 12 #瀏覽器登陸後獲得的cookie,也就是剛纔複製的字符串 13 cookie_str = r'PHPSESSID=9f20c6bb676841f38aee8589aceb5c7f; username=zhonghuihong; password=XXX'; 14 #把cookie字符串處理成字典,以便接下來使用 15 cookies = {}; 16 for line in cookie_str.split(';'): 17 key, value = line.split('=', 1); 18 cookies[key] = value; 19 #設置請求頭,直接複製便可 20 headers = {'User-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'}; 21 疑問:請求頭header是否是必需要加 22 蒐羅網上的答覆: 23 ①、不加,直接裸着請求url,彷佛也沒有報錯,本身嘗試也是這樣 24 ②、防止封ip,加上準沒錯 25 ③、禁止反扒機制,輸出的text信息中會出現抱歉,沒法訪問等字眼,這就是禁止爬取(headers是解決requests請求反爬的方法之一,至關於咱們進去這個網頁的服務器自己,僞裝本身自己在爬取數據) 26 ④、做爲一個良好的習慣,最好都要加上 27 28 疑問二:請求頭裏面已經含有cookies,請求時是否還要重複添加一個cookies=cookies參數 29 根據本身的實踐:不須要重複添加 30 31 32 疑問三:爲何訪問android端的接口基本不用提早設置header 33 header裏面是手機端信息,經過手機端頁面去爬不會那麼容易被封(這個是詢問網友來着,至今不知道緣由),根據目前實踐確實不須要 34 35 36 #在發送get請求時帶上請求頭和cookies() 37 resp = requests.get(url, headers = headers, cookies = cookies); 38 html_resp=resp.content.decode('UTF-8'); 39 #print(resp.content.decode('utf-8')); 40 soup_string = BeautifulSoup(html_resp, 'html.parser'); 41 soup_table=soup_string.find(attrs={'class':'table table-striped table-bordered table-hover'}); 42 #print(soup_table); 43 soup_str=soup_table.findAll(attrs={'style':'text-align:center;vertical-align:middle;word-break:break-all; word-wrap:break-all;'}); 44 print(soup_str); 45 #for soup in soup_str: 46 #print(soup.string); 47 #book_div = soup_string.find(attrs={"id":"book"}) 48 #book_a = book_div.findAll(attrs={"class":"title"}) 49 #for book in book_a: 50 #print book.string 51 #print(soup_string);