由上圖可見:微博已經視粉絲分布為商業機密,故爬取難度越來越大。無論web上爬,還是手機上爬,均受限。
兩種方式:手動爬+微博api爬。
本文展示手動爬,以李易峰的粉絲分布為基礎,只能爬取20頁,原始碼如下
# encoding=utf-8
import random
import json
import base64
import requests
from lxml import etree
import re
import pymongo
"""輸入你的微博賬號和密碼,可去**買,一元七個。
建議買幾十個,微博限制的嚴,太頻繁了會出現302轉移。
或者你也可以把時間間隔調大點。
"""myweibo = [
# ,,
#, ]
host=""
scrawl_id=set()
cookies =
def getcookies(weibo):
""" 獲取cookies """
loginurl = r''
for elem in weibo:
account = elem['no']
password = elem['psw']
username = base64.b64encode(account.encode('utf-8')).decode('utf-8')
postdata =
session = requests.session()
r = session.post(loginurl, data=postdata)
jsonstr = r.content.decode('gbk')
#print 'jsonstr=',jsonstr
info = json.loads(jsonstr)
#print 'info=',info
if info["retcode"] == "0":
print "get cookie success!( account:%s )" % account
cookie = session.cookies.get_dict()
else:
print "failed!( reason:%s )" % info['reason']
return cookies
def weibologin(id):
cookies = getcookies(myweibo)
print "get cookies finish!( num:%d)" % len(cookies)
cookie=random.choice(cookies)
rich_url="/%s/fans" % id
r=requests.post(rich_url,cookies=cookie)
return r.content
def url_to_page(url):
cookie=random.choice(cookies)
r=requests.post(url,cookies=cookie)
if(r.status_code==requests.codes.ok):
return r.content
else:
return r.status_code
def mongoinit():
clinet = pymongo.mongoclient("localhost", 27017)
db = clinet["sina_by_fw"]
fans_db = db["fans"]
print"mongodbpipleline_init() finish****"
return fans_db
fans_cities=
page_count=0
fans_count=0
fans_db=mongoinit()
def parse_for_fans(page,idhost):
global fans_db,fans_cities
global page_count
global fans_count
page_count+=1
print"page_count=",page_count
ids=set(re.findall('uid=(\d+)', page))
for id in ids:
if id!=str(idhost):# one is str ,the other is int
fans_count+=1
info_page=url_to_page("/%s/info" % id)
expression_nick=u'\u6635\u79f0[:|\uff1a](.*?)
nick=re.findall(expression_nick.encode('utf-8'),info_page)[0]
expression_city=u'\u5730\u533a[:|\uff1a](.*?)
city=re.findall(expression_city.encode('utf-8'),info_page)[0]#this must be encode('utf-8')!!!!!
print nick,city,fans_count
'''if len(fans_cities)==50:
fans_cities_dict=dict()
for i in range(len(fans_cities)):
fans_cities_dict[str(i+1)]=fans_cities[i]
fans_db.insert(fans_cities_dict)
del fans_cities[:]
'''e_page=etree.html(page)
url_next=e_page.xpath(u'//div[@class="pa" and @id="pagelist"]/form/div/a[text()="\u4e0b\u9875"]/@href')
if url_next:
next_page=url_to_page(host+url_next[0])
parse_for_fans(next_page,idhost)
else:
fans_cities_dict=dict()
for i in range(len(fans_cities)):
fans_cities_dict[str(i+1)]=fans_cities[i]
fans_db.insert(fans_cities_dict)
del fans_cities[:]
page=weibologin(id=1291477752)
parse_for_fans(page,idhost=1291477752)
2.mongodb的資料必須要為python字典。
爬取新浪微博
學到的東西。1 習慣用logger,而不是用print self.logger.debug 開始解析 format response.url 2 習慣用正規表示式 這是在pipeline清理資料時用到的 s 5分鐘前 if re.match d 分鐘前 s minute re.match d s g...
快速新增新浪微博粉絲的技巧
對於乙個新開的微博,初期要做的加粉絲數量,程式設計客棧只有先聚集一些粉絲人氣後,做微博質量才會有效果。註冊賬號我還是用了能吸引網民眼球的美女名效應,不過中途換了幾次暱稱,但對於加粉的效果不好。所以起名一定要好,還有不能亂換暱稱。微博內容的發布,我是用了皮皮時光機,因為白天工作比較忙,在中午或空餘的時...
爬蟲初探 新浪微博搜尋爬蟲總覽
在這裡需要說明一下,一般來說,資料抓取工作主要有兩種方式 一是通過抓包工具 fiddle 進行抓包分析,獲取ajax請求的url,通過url抓取資料,這也是更為通用 推薦的方法 另外一種方法就是後面要使用的模擬瀏覽器行為的爬蟲。那麼,在源 中資訊不可見的情況下,通過什麼方法能夠提取js 中的html...