新浪微博爬虫分享(一天可抓取1300万条数据)
新浪微博爬⾍分享(⼀天可抓取1300万条数据)微博访客 cookie 池
# -*- coding: utf-8 -*-
# @Author  :
# @Date    :
# @File    : add_wb_cookie.py
# @description : XXX
import redis
import json
import random
import requests
import datetime
import multiprocessing
from urllib.parse import quote
from concurrent import futures
>>>>>>>>>
REDIS_HOST_local = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DB = 0
COOKIE_POOL = 'weibo:cookie'
>>>>>>>>>
proxy_list = [
'127.0.0.1:8888',
'127.0.0.1:8888',
'127.0.0.1:8888',
]
class WBCookiePool(object):
def __init__(self):
self._redis_conn_pool_local = redis.ConnectionPool(
host=REDIS_HOST_local,
port=REDIS_PORT,
db=REDIS_DB
)
pass
def __del__(self):
pass
@staticmethod
def get_tid():
"""
获取 tid,c,w
:return:tid
"""
tid_url = "passport.weibo/visitor/genvisitor"
data = {
"cb": "gen_callback",
"fp": {
"os": "3",
"browser": "Chrome69,0,3497,100",
"fonts": "undefined",
"screenInfo": "1920*1080*24",
"plugins": "Portable Document Format::internal-pdf-viewer::Chrome PDF Plugin|::"
"mhjfbmdgcfjbbpaeojofohoefgiehjai::Chrome PDF Viewer|::internal-nacl-plugin::Native Client"            }
}
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
}
proxy_host = random.choice(proxy_list)
proxies = {
'http': proxy_host,
'https': proxy_host,
}
req = requests.post(
url=tid_url, data=data, headers=headers,
# proxies=proxies
)
if req.status_code == 200:
ret = eval(
('data').get('tid')
return None
def get_cookie(self):
"""
获取完整的 cookie
:return: cookie
"""
tid = _tid()
if not tid:
return None
cookies = {
新浪微博登录不了"tid": tid + "__095"  # + tid_c_w[1]
}
url = f"passport.weibo/visitor/visitor?a=incarnate&t={quote(tid)}" \
f"&w=2&c=095&gc=&cb=cross_domain&from=weibo&_rand={random.random()}"
# print(url)
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
}
proxy_host = random.choice(proxy_list)
proxies = {
'http': proxy_host,
'https': proxy_host,
}
req = (
url, cookies=cookies, headers=headers,
# proxies=proxies
)
if req.status_code != 200:
return None
ret = eval(
try:
sub = ret['data']['sub']
if sub == 1:
return None
subp = ret['data']['subp']
except KeyError:
return None
return sub, subp
def del_expire_cookie(self, max_time_int=None):
def add_cookie_2_redis(self):
count = 0
while True:
while True:
try:
sub, sub_p = _cookie()
break
except BaseException as be:
print(be)
continue
count += 1
expire_time = w() - datetime.timedelta(minutes=10)
expire_time_int = int(expire_time.timestamp())
self.del_expire_cookie(max_time_int=expire_time_int)
headers = {'cookie': f'SUB={sub};SUBP={sub_p}'}
print(headers)
# dis_conn.kie_pool, json.dumps(headers, ensure_ascii=False))
timestamp_int = int(w().timestamp())
data_string = json.dumps(headers, ensure_ascii=False)
def main():
wb_cookie_pool = WBCookiePool()
cpu_count = multiprocessing.cpu_count()
pool = futures.ThreadPoolExecutor(max_workers=cpu_count)
for i in range(cpu_count):
pool.submit(wb_cookie_pool.add_cookie_2_redis)
if __name__ == '__main__':
main()
爬⾍功能:
此项⽬和类似,主要爬取新浪微博⽤户的个⼈信息、微博信息、粉丝和关注()。
代码获取新浪微博Cookie进⾏登录,可通过多账号登录来防⽌新浪的反扒(⽤来登录的账号可从淘宝购买,⼀块钱七个)。
项⽬爬的是新浪微博wap站,结构简单,速度应该会⽐较快,⽽且反扒没那么强,缺点是信息量会稍微缺少⼀些(可见)。
爬⾍抓取微博的速度可以达到 1300万/天 以上,具体要视⽹络情况,我使⽤的是校园⽹(⼴⼯⼤学城校区),普通的家庭⽹络可能才⼀半的速度,甚⾄都不到。
环境、架构:
开发语⾔:Python2.7
开发环境:64位Windows8系统,4G内存,i7-3612QM处理器。
数据库:MongoDB 3.2.0
(Python编辑器:Pycharm 5.0.4;MongoDB管理⼯具:MongoBooster 1.1.1)
主要使⽤ scrapy 爬⾍框架。
下载中间件会从Cookie池和User-Agent池中随机抽取⼀个加⼊到spider中。
start_requests 中根据⽤户ID启动四个Request,同时对个⼈信息、微博、关注和粉丝进⾏爬取。
将新爬下来的关注和粉丝ID加⼊到待爬队列(先去重)。
使⽤说明:
启动前配置:
MongoDB安装好 能启动即可,不需要配置。
Python需要安装好scrapy(64位的Python尽量使⽤64位的依赖模块)
另外⽤到的python模块还有:pymongo、json、base64、requests。
将你⽤来登录的微博账号和密码加⼊到 cookies.py ⽂件中,⾥⾯已经有两个账号作为格式参考了。
另外⼀些scrapy的设置(如间隔时间、⽇志级别、Request线程数等)可⾃⾏在setting⾥⾯调。运⾏截图:
数据库说明:
SinaSpider主要爬取新浪微博的个⼈信息、微博数据、关注和粉丝。
数据库设置 Information、Tweets、Follows、Fans四张表,此处仅介绍前⾯两张表的字段。
Information 表:
_id:采⽤ “⽤户ID” 作为唯⼀标识。
Birthday:出⽣⽇期。
City:所在城市。
Gender:性别。
Marriage:婚姻状况。
NickName:微博昵称。
Num_Fans:粉丝数量。
Num_Follows:关注数量。
Num_Tweets:已发微博数量。
Province:所在省份。
Signature:个性签名。
URL:微博的个⼈⾸页。
Tweets 表:
_id:采⽤ “⽤户ID-微博ID” 的形式作为⼀条微博的唯⼀标识。
Co_oridinates:发微博时的定位坐标(经纬度),调⽤地图API可直接查看具体⽅位,可识别到在哪⼀栋楼。
Comment:微博被评论的数量。
Content:微博的内容。
ID:⽤户ID。
Like:微博被点赞的数量。
PubTime:微博发表时间。
Tools:发微博的⼯具(⼿机类型或者平台)
Transfer:微博被转发的数量。
微博爬⾍,单机每⽇千万级的数据 && 吐⾎整理的微博爬⾍总结

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论