爬蟲---Beautiful Soup 反反爬蟲事例


  前兩章簡單的講了Beautiful Soup的用法,在爬蟲的過程中相信都遇到過一些反爬蟲,如何跳過這些反爬蟲呢?今天通過知乎網寫一個簡單的反爬中

 

什么是反爬蟲

簡單的說就是使用任何技術手段,阻止別人批量獲取自己網站信息的一種方式。關鍵也在於批量。

 

反反爬蟲機制

  • 增加請求頭---headers為了模擬更真實的用戶場景
  • 更改IP地址---網站會根據你的IP對網站訪問頻密,判斷你是否屬於爬蟲
  • ua限制---UA是用戶訪問網站時候的瀏覽器標識,其反爬機制與ip限制類似
  • 模擬帳號登錄----通過request模擬登錄進行訪問網站
  • cookies的限制---網站頁面每次請求的cookies不同

 

爬取知乎熱榜

1.首先打開需要爬取的網站

2.分析網站的html,標簽為’a‘,屬性為target="_blank"

3.通過request方式進行請求網站

4.首先我們先不攜帶任何的反反爬蟲機制進行訪問

# coding:utf-8
import requests
from  bs4 import BeautifulSoup
url = 'https://www.zhihu.com/hot'
html = requests.get(url,verify = False).content.decode('utf-8') # verify = False表示請求https
soup = BeautifulSoup(html,'html.parser')
name = soup.find_all('a',target="_blank")
for i in name:
    print(i)

結果發現請求為空

5.從F12中提取出完整的請求頭(也可以通過fiddler進行查看)

  • 請求地址的host
  • 請求的cookies
  • 請求的User-Agent

 

# coding:utf-8
import requests
from  bs4 import BeautifulSoup
url = 'https://www.zhihu.com/hot'
# 添加請求頭
headers={
    "host":"www.zhihu.com",
    "cookie":'_zap=482b5934-4878-4c78-84f9-893682c32b07; d_c0="ALCgSJhlsQ6PTpmYqrf51G'
             'HhiwoTIQIlS1w=|1545203069"; _xsrf=XrStkKiqUlLxzwMIqRDc01J7jikO4xby; q_c1=94622'
             '462a93a4238aafabad8c004bc41|1552532103000|1548396224000; __utma=51854390.1197068257.'
             '1552532107.1552532107.1552532107.1; __utmz=51854390.1552532107.1.1.utmcsr=zhihu.com|utmccn=(r'
             'eferral)|utmcmd=referral|utmcct=/; __utmv=51854390.100--|2=registration_date=20190314=1^3=entry_da'
             'te=20190125=1; z_c0="2|1:0|10:1552535646|4:z_c0|92:Mi4xcFRlN0RnQUFBQUFBc0tCSW1HV3hEaVlBQUFCZ0FsVk5Ya'
             'DUzWFFBWExTLXVpM3llZzhMb29QSmRtcjlKR3pRaTBB|03a1fa3d16c98e1688cdb5f6ba36082585d72af2f54597e370f05207'
             'cd3a873f"; __gads=ID=27a40a1873146c19:T=1555320108:S=ALNI_MYb5D7sBKFhvJj32HBQXgrhyC6xxQ; tgw_l7_route=7'
             '3af20938a97f63d9b695ad561c4c10c; tst=h; tshl=',
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
}
html = requests.get(url,headers=headers,verify = False).content.decode('utf-8') # verify = False表示請求https
soup = BeautifulSoup(html,'html.parser')
name = soup.find_all('a',target="_blank")
for i in name:
    print(i.get_text())

執行后發現成功的把熱榜下的一些信息請求出來

喜歡的小伙伴可以自己手動試一試。


免責聲明!

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



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