看完了BeautifulSoup的官方文檔, 今天試着爬了一波自家學校moodle, 寫了一個簡陋查分器, 還算是成功, 代碼已經扔在github上了, 感興趣的朋友可以去看看.
https://github.com/zhang77595103/web-crawler
今天模仿大神xlzd, 准備先寫一個爬取豆瓣電影top250, 主要也是想看看反爬蟲的機制, 畢竟不是每個網站都像我們學校的官網這樣, 爬蟲隨進隨出...
因為目前我還有沒有看過requests這個庫的官方文檔, 所以有現在暫且是有一個知識點記一個知識點吧...
import requests homePageResponse = requests.get("https://movie.douban.com/") print(type(homePageResponse.content)) print(type(homePageResponse.text)) --------------------------------------------------------------- /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/zhangzhimin/PycharmProjects/PythonAgain/test2.py <class 'bytes'> <class 'str'> Process finished with exit code 0
這是.content和.text的區別, 那么這里有個知識是, 在py3中, bytes解碼(decode())會變成str, str編碼會變成bytes(encode)...
所以總的來說.content.decode()就相當於.text...
按照大神的思路, 劇本應該是這樣的 :
<html> <head><title>403 Forbidden</title></head> <body bgcolor="white"> <center><h1>403 Forbidden</h1></center> <hr><center>dae</center> </body> </html>
產生403的原因,一般可能是因為需要登錄的網站沒有登錄或者被服務器認為是爬蟲而拒絕訪問,這里很顯然屬於第二種情況。一般,瀏覽器在向服務器發送請求的時候,會有一個請求頭——
User-Agent
,它用來標識瀏覽器的類型.當我們使用requests來發送請求的時候,默認的User-Agent是python-requests/2.8.1
(后面的數字可能不同,表示版本號)。那么,我們試試看如果將User-Agent偽裝成瀏覽器的,會不會解決這個問題呢?
然后遺憾的是, 並沒有出現大神所謂的403, 這讓我很尷尬... 不過還是耐着性子繼續爬吧..
我先假裝我的網頁出了403(其實我發現我不加頭也完美爬取了), 然后我們來給自己的爬蟲User-Agent吧...
我隨便找個一個網站, 打開檢查之后, 刷新了一下... 可以看到最后一行就是我們需要的UA...
最后的代碼如下...
1 import requests 2 from bs4 import BeautifulSoup 3 4 5 def pageCheck(url, headers): 6 homePageResponse = requests.get(url, headers=headers) 7 homePageSoup = BeautifulSoup(homePageResponse.content, 'lxml') 8 for li in homePageSoup.find("ol", class_ = "grid_view").find_all("li"): 9 link = li.find("div", class_ = "hd").a 10 print(link.span.string + " : " + link['href']) 11 12 13 url = "https://movie.douban.com/top250" 14 start = 25 15 headers = { 16 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) \ 17 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36' 18 } 19 for cnt in range(0, 10): 20 print("\n\nThis is page " + str(cnt+1) + " ...\n\n") 21 if cnt == 0: 22 curUrl = url 23 else: 24 curUrl = url + "?start=" + str(start * cnt) + "&filter" 25 pageCheck(curUrl, headers)