之前听了几堂公司的python培训,于是要找个机会练习下。
用python写一个爬虫,爬取知乎“Python”话题下所有的精华回答。这个是这次的任务。
先贴代码吧,因为是初学,感觉写的很渣。
#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,爬了其他一些网站都是可以的,但是知乎却显示500错误。应该是知乎对于直接ip地址访问做了反爬机制。
第二点,是下一页的逻辑,其实这种判断方法应该不是最好的。总觉得程序中和字符串进行比较来确定是否是最后一页的容错性很差。好在这不是客户端代码,只是一个脚本,要修改也是比较容易。
最后有个延迟10s,是为了防止知乎封ip。知乎貌似要求爬它数据要有10s的间隔,为了给服务器减压吧。
保存下来的答案其实是html格式的吧,直接看的话还是有点纠结。可以改成html格式查看。
网友评论