python爬去知乎动态内容_通过Python爬虫爬取知乎某个问题下的图片

该爬虫主要是通过requests来实现的,该模块完全可以很好的代替urllib和urllib2,而且功能更强大,详细可以看这里。同时也用到了pillow模块中的image对象,实现环境是Python2,不过在Python3上只需很小的改动就可以正常运行。

首先通过cookie模拟登陆到知乎,然后获取知乎某一个问题的链接,打开并获取该问题回答下的图片,然后保存到本地。我们先看下知乎中的网页html文本,对于某一个用户的回答是这样的:红色方框中的标签是回答的具体内容标签

20160710211447967

然后原始图片是在下面这个标签里,包含在上图红色方框的标签下:

20160710211743909

我们在写正则表达式的时候只需匹配到这个标签,然后取出里面的url就可以了。具体的正则表达式如下,分为两部分,首先取出”zm-editable-content.."标签里的全部内容,然后在从中取出"data-actualsrc"的内容:

pattern = re.compile('(.*?)

', re.S)

pattern = re.compile('data-actualsrc="(.*?)">', re.S)

然后我们通过模拟登陆到知乎,具体的模拟登陆解释可以看

这里。登陆进去后,我们在打开某一个知乎问题链接,爬取里面的图片然后下载到本地目录,具体看下面的代码:注意在输入验证码的时候我们用的是input(),在Python2中用input()输入的时候,如果输入字符串,那么要在输入的字符上加上引号,否则会报错,如:“abcd"

# -*-coding:utf-8 -*-

import requests

# import urllib

# import urllib2

import cookielib

import re

import time

import os.path

from PIL import Image

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'

headers = {'User-Agent': user_agent}

session = requests.session()

session.cookies = cookielib.LWPCookieJar(filename='cookies')

try:

session.cookies.load(ignore_discard=True)

except:

print "Cookie 未能加载"

def get_xsrf():

'''_xsrf 是一个动态变化的参数'''

index_url = "http://www.zhihu.com"

index_page = session.get(index_url, headers=headers)

html = index_page.text

pattern = r'name="_xsrf" value="(.*?)"'

_xsrf = re.findall(pattern, html)

return _xsrf[0]

def get_captcha():

t = str(int(time.time() * 1000))

captcha_url = 'http://www.zhihu.com/captcha.gif?r' + t + "&type=login"

print captcha_url

r = session.get(captcha_url, headers = headers)

with open('captcha.jpg', 'wb') as f:

f.write(r.content)

f.close()

try:

im = Image.open('captcha.jpg')

im.show()

im.close()

except:

print u'captcha.jpg 所在目录:%s, 手动输入'% os.path.abspath('captcha.jpg')

captcha = input("input captcha\n")

return captcha

def isLogin():

url = "https://www.zhihu.com/settings/profile"

login_code = session.get(url, allow_redirects=False).status_code

print "login code: ", login_code

if int(x=login_code) == 200:

return True

else:

return False

def login(secret, account):

if re.match(r"^1\d{10}$", account):

print "手机号登陆\n"

post_url = 'http://www.zhihu.com/login/phone_num'

postdata = {

'_xsrf': get_xsrf(),

'password': secret,

'remember_me': 'true',

'phone_num': account,

}

else:

print '邮箱登录\n'

post_url = 'http://www.zhihu.com/login/email'

postdata = {

'_xsrf': get_xsrf(),

'password': secret,

'remember_me': 'true',

'email': account,

}

try:

login_page = session.post(post_url, data=postdata, headers=headers)

login_code = login_page.text

print login_page.status

print login_code

print 'what?'

except:

print '需要验证码'

postdata['captcha'] = get_captcha()

login_page = session.post(post_url, data=postdata, headers=headers)

login_code = eval(login_page.text) #eval 从字符串中提取字典

u = login_code['msg']

session.cookies.save()

def getPageCode(pageUrl):

try:

req = session.get(pageUrl, headers=headers)

print req.request.headers

return req.text

except urllib2.URLError, e:

if hasattr(e, 'reason'):

print u"打开链接失败...", e.reason

return None

def getImageUrl(pageUrl):

pageCode = getPageCode(pageUrl)

if not pageCode:

print "打开网页链接失败.."

return None

pattern = re.compile('(.*?)', re.S)

items = re.findall(pattern, pageCode)

imagesUrl = []

pattern = re.compile('data-actualsrc="(.*?)">', re.S)

for item in items:

urls = re.findall(pattern, item)

imagesUrl.extend(urls)

for url in imagesUrl:

print url

return imagesUrl

def saveImagesFromUrl(pageUrl, filePath):

imagesUrl = getImageUrl(pageUrl)

if not imagesUrl:

print 'imagesUrl is empty'

return

nameNumber = 0;

for image in imagesUrl:

suffixNum = image.rfind('.')

suffix = image[suffixNum:]

fileName = filePath + os.sep + str(nameNumber) + suffix

nameNumber += 1

print 'save in: ', fileName

response = requests.get(image)

contents = response.content

try:

with open(fileName, "wb") as pic:

pic.write(contents)

except IOError:

print 'Io error'

login('这里是密码','这里是你的知乎账户')

saveImagesFromUrl('https://www.zhihu.com/question/46435597', '/Volumes/HDD/image')最后就可以把图片保存到image这个目录下了,当然这个爬虫目前还可以做很多的改动,比如翻页功能,然后多线程下载之类的,后续改进后我在贴上来吧,效果类似这样:

20160710213311929

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值