Python新浪微博相册爬虫

九 14 2013

其实和上个爬虫基本一样,只是需要登录。

由于该死的验证码,就暂时没有web版了。

[code language="python"]

# -*- coding: utf-8 -*-
import urllib
import urllib2
import re
import cookielib

#搞定cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)

#获取页面html代码
def GetHtml(url,data=None):
req = urllib2.Request(url,data)
req.add_header('User-Agent','Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65')
return urllib2.urlopen(req).read()

#获取要抓取的页面url并转为对应的weibo.cn版的url
def GetUrl():
url = raw_input('请输入相册地址:')
if re.match('http://photo.weibo.com/(\d+)/albums/detail/album_id/(\d+)',url):
Matched = re.search('http://photo.weibo.com/(\d+)/albums/detail/album_id/(\d+)',url).groups()
return 'http://weibo.cn/album/' + Matched[1] + '000000' + Matched[0]
elif re.match('http://photo.weibo.com/(\d+)/talbum',url):
return 'http://weibo.cn/album/albummblog?fuid=' + re.search('http://photo.weibo.com/(\d+)/talbum',url).groups()[0]
else:
return None

#获取页面中的图片(其实是图片地址中不知道怎么称呼的一串字母数字)
def GetUrlList(url):
HTML = GetHtml(url)
Pattern = '<img src="http://ww\d.sinaimg.cn/square/(\w+?).\w{3}"'
return re.findall(Pattern, HTML, re.S)

#获取相册页数
def GetPageCount(url):
pattern ='type="hidden" value="(\d+?)"' #re.compile('type="hidden" value="(\d+)"')
PageNumber = re.findall(pattern,GetHtml(url))
if PageNumber: return PageNumber[0]
return 1 #Pattern.search(HTML).groups()[0]

#登录并抓取图片
def GetThingsDone():
url = GetUrl()
UrlList,num = [],1
if re.match("(.*)<a href='(.*?)'>登录</a>",GetHtml('http://weibo.cn/pub/')):
#----------------------模拟登录过程-------------------
#------------------需要修改用户名、密码----------------
HTML = GetHtml('http://login.weibo.cn/login/')
action_url = re.findall('<form action="(.+?)" method="post">',HTML)[0]
passwd_name = re.findall('<input type="password" name="(.+?)" size="30" value=""/>',HTML)[0]
vk_value = re.findall('<input type="hidden" name="vk" value="(.+?)" />',HTML)[0]
Data = urllib.urlencode({
'mobile':'yourname',
passwd_name:'yourpassword',
'vk':vk_value,
'backURL':'http://weibo.cn/',
'backTitle':'手机新浪网',
'remember':'on',
'tryCount':'',
'submit':'登录',})
GetHtml('http://login.weibo.cn/login/'+action_url,Data)
#-----------------------------------------------------

PageCount = int(GetPageCount(url))
while (num <= PageCount):
UrlList += GetUrlList(url + '&page=' + str(num))
num += 1
return ['http://ww4.sinaimg.cn/large/' + i + '.jpg' for i in UrlList]

Images = GetThingsDone()
for image in Images:
print image

[/code]

4 responses so far

Python练手:贴吧爬虫

八 24 2013

看了点Python,写个爬虫练手。
[code language="python"]
# -*- coding: UTF-8 -*-
import urllib2
import re

#获取帖子页数
def GetPageCount(url):
Pattern = re.compile(r'max-page="(\d)"')
Source = urllib2.urlopen(url).read()
if Pattern.search(Source):
return int(Pattern.search(Source).groups()[0])
else:
return 1

#抓取帖子内容
def Analyze(url,tag):
if not (re.match('http://tieba.baidu.com/p/\w*',url) and url):
return None
url = re.findall('http://tieba.baidu.com/p/\w*',url)[0]+'?see_lz=1'
imgurl = []
content=''
global PageCount
PageCount = GetPageCount(url)
count = 1
#当tag为'all'时抓取回复全文
if tag=='all':
while count <= PageCount:
PageUrl = url + '&pn=' + str(count)
HTML = urllib2.urlopen(PageUrl).read().decode('gbk').encode('UTF-8')
Pattern = re.compile(r'http://.*/sign=\w*?/(\w*?)\.jpg')
content += '<br />'.join(re.findall('<cc>(.*?)</cc>', HTML, re.S))
count +=1
return content
#否则仅抓取回复图片
while count <= PageCount:
PageUrl = url + '&pn=' + str(count)
HTML = urllib2.urlopen(PageUrl).read().decode('gbk').encode('UTF-8')
Pattern = re.compile(r'http://.*/sign=\w*?/(\w*?)\.jpg')
for i in re.findall('<cc>(.*?)</cc>', HTML, re.S):
for i in re.findall('<img.*?src="(.*?)"',i):
#转为原始大小的图片
if re.match(Pattern,i):
i = 'http://imgsrc.baidu.com/forum/pic/item/' + Pattern.search(i).groups()[0] +'.jpg'
#表情什么的就不要了
if (re.match(r'http://static.tieba.baidu.com/tb/editor/images/.*',i)):
continue
imgurl.append(i)
count = count + 1
return imgurl

#web版本时用于防'防盗链'
def ChangeUrl(text):
if text:
for i in set(re.findall('http://hiphotos.baidu.com/.*?.jpg',text)):
text=text.replace(i,'http://www.beihaiw.com/pic.php?url='+i)
return text
else: return None

[/code]
用Tornado框架写个web版本,架在GAE上。
http://nerdsproject01.appspot.com/tieba

访问不了可以试试http://proj.a-nerd.info/,通过post方式获取GAE的结果。
[code language="python"]
# -*- coding: utf-8 -*-
import os
import tornado.wsgi
import tornado.web
import Tieba

#当直接访问时返回index.html
class MainHandler(tornado.web.RequestHandler):
def get(self, ):
self.render('index.html')

#返回图片网址
class Img(tornado.web.RequestHandler):
def post(self, ):
url = self.get_argument('url')
if url:
urllist = Tieba.Analyze(url,'img')
if urllist:
self.write('<p><center>共爬了'+str(Tieba.PageCount)+'页<br>')
self.write('找到了'+str(len(urllist))+'张图片,累死了喵</center></p>')
self.write('<br>'.join(urllist))
else: self.write('<center><p>喵的,请输入正确的贴吧地址(╯‵□′)╯︵┴─┴</p></center>')

#返回图片的HTML代码,用于转载
class ImgHtml(tornado.web.RequestHandler):
def post(self, ):
url = self.get_argument('url')
if url:
urllist = Tieba.Analyze(url,'img')
if urllist:
self.write('<p><center>共爬了'+str(Tieba.PageCount)+'页<br>')
self.write('找到了'+str(len(urllist))+'张图片,累死了喵</center></p>')
self.write('<center><textarea rows="15" cols="111">')
for i in urllist:
self.write('<img src="'+i+'"><br>\n')
self.write("</textarea></center>")
else: self.write('<center><p>喵的,请输入正确的贴吧地址(╯‵□′)╯︵┴─┴</p></center>')

#返回所有回复
class All(tornado.web.RequestHandler):
def post(self, ):
url = self.get_argument('url')
if url:
Source=Tieba.ChangeUrl(Tieba.Analyze(url,'all'))
if Source:
self.write('<p><center>共爬了'+str(Tieba.PageCount)+'页<br>')
self.write('找到了好多字,累死了喵</center></p>')
self.write(Source)#("<pre>"+Source+"</pre>")
else: self.write('<center><p>喵的,请输入正确的贴吧地址(╯‵□′)╯︵┴─┴</p></center>')

#返回回复的HTML代码,用于保存和转载
class AllHtml(tornado.web.RequestHandler):
def post(self, ):
url = self.get_argument('url')
if url:
Source=Tieba.ChangeUrl(Tieba.Analyze(url,'all'))
if Source:
self.write('<p><center>共爬了'+str(Tieba.PageCount)+'页<br>')
self.write('找到了好多字,累死了喵</center></p>')
self.write("<center><textarea rows='15' cols='111'>"+Source+"</textarea></center>")
else: self.write('<center><p>喵的,请输入正确的贴吧地址(╯‵□′)╯︵┴─┴</p></center>')

settings = {
'template_path' : os.path.join(os.path.dirname(__file__), 'template'),
'debug' : True,
'gzip' : True,
}

app = tornado.wsgi.WSGIApplication(
[('/', MainHandler),
('/img', Img),
('/imghtml',ImgHtml),
('/all', All),
('/allhtml',AllHtml)],
**settings
)

[/code]

2 responses so far

Thank you for stopping by

七 02 2013

Google Reader has been discontinued. We want to thank all our loyal fans. We understand you may not agree with this decision, but we hope you'll come to love these alternatives as much as you loved Reader.

Sincerely,

The Google Reader team

Frequently-asked questions

  1. What will happen to my Google Reader data?

    All Google Reader subscription data (eg. lists of people that you follow, items you have starred, notes you have created, etc.) will be systematically deleted from Google servers. You can download a copy of your Google Reader data via Google Takeout until 12PM PST July 15, 2013.

  2. Will there be any way to retrieve my subscription data from Google in the future?

    No -- all subscription data will be permanently, and irrevocably deleted. Google will not be able to recover any Google Reader subscription data for any user after July 15, 2013.

  3. Why was Google Reader discontinued?

    Please refer to our blog post for more information.

 

 

Google Reader永垂不朽

No responses yet

别想说服我!

六 02 2013

人做判断的时候有两种机制:一种是“科学家机制”,先有证据再下结论;一种是“律师机制”,先有了结论再去找证据。世界上科学家很少,你猜绝大多数人使用什么机制思考?

《潜意识:控制你行为的秘密》

[英]莱纳德·蒙洛迪诺

Vintage出版社

2013年出版

 霍金写《时间简史》和《大设计》两书,都有一个被所有人忽视了的第二作者:列纳德·蒙洛迪诺。这两本书能够畅销,我怀疑霍金本人的贡献也许仅仅是他的名气,因为公众其实并不真喜欢科学知识——哪怕是霍金的知识。而霍金也深知“每一个数学公式都能让这本书的销量减少一半”。如果真有读者能在这两本“霍金的书”中获得阅读上的乐趣,很可能相当程度上要归功于蒙洛迪诺。从他独立完成的Subliminal:How Your Unconscious Mind Rules Your Behavior(《潜意识:控制你行为的秘密》)这本书来看,蒙洛迪诺真的是个非常会写书的人。他完全了解读者想看什么。

看完《潜意识》,我也知道读者想看什么了。在书中蒙洛迪诺讲了个很有意思的笑话。说有一个白人天主教徒来到天堂门口想要进去,他跟守门人列举了自己的种种善行,但守门人说:“可以,不过你还必须能够正确拼写一个单词才能进。”“哪个单词?”“上帝。”“GOD。”“你进去吧。”

一个犹太人来到天堂门口,他同样被要求正确拼写一个单词才能进。守门人考他的单词仍然是“上帝”。这个单词非常简单,所以他同样拼写正确,于是也进去了。

故事最后,一个黑人来到天堂门口,他面临同样的规则。但是守门人让他拼写的单词是“捷克斯洛伐克”。

这个笑话的寓意是,像我们这样受过高等教育的人接收信息都有一个门槛,低于这个门槛的我们根本不看。我的门槛就相当高,谁想向我说明一个什么科学事实,我一般都要求他出具学术论文。比如作为一个爱国者,我对中医的存废和转基因的好坏这两个问题非常感兴趣,特别关注相关的论文。然而就算是论文也有好有坏,要知道有的论文根本不严谨。所以一篇论文质量好坏,我也有自己的判断标准,达到我的标准才算得上是严谨的好论文:

如果这篇论文是说中医有效的,我就要求它拼写“上帝”。如果这篇论文是说转基因无害的,我就要求它拼写“捷克斯洛伐克”。

你不用笑我,你也有同样的毛病。蒙洛迪诺说,人做判断的时候有两种机制:一种是“科学家机制”,先有证据再下结论;一种是“律师机制”,先有了结论再去找证据。世界上科学家很少,你猜绝大多数人使用什么机制思考?每个人都爱看能印证自己已有观念的东西。我们不但不爱看,而且还会直接忽略那些不符合我们已有观念的证据。

Continue Reading »

4 responses so far

Ubuntu账号切换时显示配对失败

五 04 2013

错误提示:

lcoal and server roots are different(ROOT_MISMATCH)

 

Alt+F2,输入seahorse,回车,删除"Ubuntu One" 和"Desktopcouch"(我没找到这个)

终端运行

u1sdtool -q; sudo rm -rf ~/.local/share/ubuntuone; u1sdtool -c;

 

 Ubuntu One Help

2 responses so far