之前聽了幾堂公司的python培訓(xùn),于是要找個機(jī)會練習(xí)下区匣。
用python寫一個爬蟲馁启,爬取知乎“Python”話題下所有的精華回答。這個是這次的任務(wù)哼勇。
先貼代碼吧,因為是初學(xué)呕乎,感覺寫的很渣积担。
#coding=utf-8
import requests
from bs4 import BeautifulSoup
import time
base_url = 'https://www.zhihu.com'
add_url = '/topic/19552832/top-answers?page=1'
num = 0
pageNum = 1
bStop = False
f=open("zhihu09312","w")
headers = {
'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36',
"Referer": "http://www.zhihu.com/",
'Host': 'www.zhihu.com',
'rememberme': "true"
}
while(True):
try:
first_page = requests.request('get', base_url+ add_url,headers=headers)
soup = BeautifulSoup(first_page.content, "lxml")
title_list = [i.get_text() for i in soup.select("span.zg-gray-normal")]
for i in title_list:
if i == '下一頁':
bStop = True
break
title_list = [i.get_text() for i in soup.select("textarea.content")]
for i in title_list:
num+=1
print num
print i
f.write(str(num) + "\n")
f.write(i.encode('utf-8') + "\n\n\n\n\n\n")
try:
pageNum+=1
add_url = '/topic/19552832/top-answers?page=' + str(pageNum)
except:
break
if bStop:
break
time.sleep(10)
except Exception as e:
print(e)
break
說說遇到的坑吧:
首先,就是get請求的時候猬仁,一開始沒有加headers帝璧,爬了其他一些網(wǎng)站都是可以的,但是知乎卻顯示500錯誤湿刽。應(yīng)該是知乎對于直接ip地址訪問做了反爬機(jī)制的烁。
第二點,是下一頁的邏輯诈闺,其實這種判斷方法應(yīng)該不是最好的渴庆。總覺得程序中和字符串進(jìn)行比較來確定是否是最后一頁的容錯性很差雅镊。好在這不是客戶端代碼襟雷,只是一個腳本,要修改也是比較容易仁烹。
最后有個延遲10s耸弄,是為了防止知乎封ip。知乎貌似要求爬它數(shù)據(jù)要有10s的間隔卓缰,為了給服務(wù)器減壓吧计呈。
保存下來的答案其實是html格式的吧,直接看的話還是有點糾結(jié)征唬≌鸲#可以改成html格式查看。