知识星球爬虫2023-2-9

  1. Python 3.10编写爬虫
  2. 全文19538字
  3. 标签:#本人初学者#,#仅供学习交流,其他用途与本人无关#,#侵权必删#,#转载标明出处#

声明:

        1.欢迎各位朋友转载,但是请注明文章出处,附上文章链接。

        2.所有文章均为个人学习心得,部分学习视频过程中的截图如有侵犯到作者隐私,可联系我删除。

        3.欢迎各位朋友多交流学习,本人对自己的文章进行不定期的修正与更新,因此请到我的博客首页查看某篇章的最新版本。

功能介绍:

        爬取知识星球个人主页

        通过一个星球的ID,找到一些用户的主页,然后通过这个用户,找到其他用户。

        相当于“发散式”爬取,数据越来越多。

        爬取的数据会进行整合,一般情况下需要手动停止运行。

头文件:

        包含如下,部分头文件使用的代码,可以用其他头文件写出来,但是我比较懒,哪个方便用哪个了

import time
import requests
import re
import json
import os.path
from lxml import etree
from bs4 import BeautifulSoup
from urllib.parse import unquote
from concurrent.futures import ThreadPoolExecutor

使用教程:

        1.复制代码,保存到.py文件

        2.在同目录下,建立init.txt文件

        3.init.txt文件内容如下:(一些bug不改了,这里cookie不能用),这里是爬取的星球ID

  • cookie:你的cookie,不加引号
    group:星球ID,不加引号
    

        4.在代码中(大概第12行),headers里面的cookie,修改为你的cookie,user-Agent修改为你的user-Agent

        5.运行.py

说明:

        1.同级文件夹下,自动生成group目录,方便参考

        2.所有数据存在同级目录的文件夹下

        3.所有数据公开

效果展示:

       

        

      

        (已打码)

 

代码:

本人只学习了几天python,照猫画虎搞出来的,代码基本上就是堆出来的QAQ

import time
import requests
import re
import json
import os.path
from lxml import etree
from bs4 import BeautifulSoup
from urllib.parse import unquote
from concurrent.futures import ThreadPoolExecutor
#必要的headers,params
headers = {
    "cookie": "UM_distinctid=185a6fd266b1052-0fd69e94d3f3d3-7a575473-144000-185a6fd266c12e2;%20sensorsdata2015jssdkcross=%7B%22distinct_id%22:%22581888515454254%22,%22first_id%22:%22185a6e381cca28-059f02096947914-7a575473-1327104-185a6e381cd14b9%22,%22props%22:%7B%22$latest_traffic_source_type%22:%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22,%22$latest_search_keyword%22:%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22,%22$latest_referrer%22:%22%22%7D,%22identities%22:%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTg1YTZlMzgxY2NhMjgtMDU5ZjAyMDk2OTQ3OTE0LTdhNTc1NDczLTEzMjcxMDQtMTg1YTZlMzgxY2QxNGI5IiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiNTgxODg4NTE1NDU0MjU0In0=%22,%22history_login_id%22:%7B%22name%22:%22$identity_login_id%22,%22value%22:%22581888515454254%22%7D,%22$device_id%22:%22185a6e381cca28-059f02096947914-7a575473-1327104-185a6e381cd14b9%22%7D;%20abtest_env=product;%20zsxq_access_token=3BE39572-496B-AD29-E66C-CDC7912C17F4_AA107E8F11E4AFA7;%20__cuid=44c6d83431bc4a62916cb7e96455ad51;%20amp_fef1e8=b5e0e4bc-529f-4f34-a6b0-c3e564876e57R...1goo3hif4.1goo3i0vd.a.2.c",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.52",
    "referer": "https://wx.zsxq.com/"
}
group_list = []  #获取其他group
#文件目录
root = '爬虫数据'
def GetPath(group_id):
    name = GetGroupName(group_id)
    path = f'{root}\\{name}({group_id})'
    if not os.path.exists(path):
        os.makedirs(path)
    return path
def GetGroupName(group_id):
    resp = GetRequests(f'https://public.zsxq.com/groups/{group_id}.html')
    html = etree.HTML(resp.text)
    name = html.xpath('/html/body/div/div/div/div/div/main/div[1]/div/div[1]/h3/text()')
    #print(name[0])
    return name[0]
#初始化,获取执行的group数据ID
def init_file():

    #文件格式#
    #cookie=xxxxx
    #groups_id=xxxxx
    with open(f'init.txt', mode='r+', encoding='utf-8') as f:
        list_line = f.readlines()#获取文件中的每一行,存到list中
        #print(list_line)
    f.close()
    headers['cookies'] = str(list_line[0].split(':')[1])#初始化headers
    groups_id = str(list_line[1].split(':')[1])#初始化groups_id
    gid = groups_id.replace('\n', '').replace('\t', '').replace(' ', '')  # 获取
    #params['group_id'] = gid

    return gid#获取

#初始化,获取group的数据,返回hid
def init_path(dic,group_id):

    #path = GetPath(group_id)
    if not os.path.isfile(f'group.txt'):
        with open(f'group.txt', mode='w+', encoding='utf-8') as f:
            f.close()
    with open(f'group.txt', mode='r+', encoding='utf-8') as f:
        list_group = f.readlines()  # 获取文件中的每一行,存到list中
    f.close()
    for g in list_group:
        gro = g.replace('\n', '').split(':')
        dic = {}
        dic[gro[0]] = gro[1]
        group_list.append(dic)
    #url = "https://api.zsxq.com/v2/users/"+hid+"/topics/footprint"
    url = f'https://public.zsxq.com/groups/{group_id}.html'
    resp = GetRequests(url)
    hid_list = GetStarHid(resp.text) #str_list类型
    #desc = GetStarDesc(resp.text)
    for hid in hid_list:
        if not hid in dic:
            dic[hid] = False
    return dic #list[str] = bool

#打开网页
def GetRequests(url,params=''):
    resp = requests.get(url, headers=headers,params=params)
    resp.encoding = 'utf-8'
    return resp

#得到星球首页初始hid
def GetStarHid(text):
    sc = str(BeautifulSoup(text, "html.parser"))
    obj_hid = re.compile(r'user_id:(?P<hid>[0-9]+),',re.S)
    hid_list_iter = obj_hid.finditer(sc)
    dic_show = {}
    hid_list = []
    for f in hid_list_iter:#获取星球首页的hid,作为攻破口
        hid_list.append(str(f.group('hid')))
    #print(dic_show)
    #print(hid_list)
    return hid_list#str类型

#得到星球首页简介信息
def GetStarDesc(text):
    sc = str(BeautifulSoup(text, "html.parser"))
    obj_star = re.compile(r'group_id:(?P<group_id>.*?),name:"(?P<name>.*?)",description:"(?P<des>.*?)"', re.S)
    res = obj_star.finditer(sc)
    dic_show = {}
    for f in res:  # 获取星球的基本信息id,name,desc
        dic_show['group_id'] = f.group('group_id')
        dic_show['des'] = f.group('des')
        dic_show['name'] = f.group('name')
    return dic_show

#读入任务列表(hid):
def LoadTask(group_id):
    path = f'{root}\\init.txt'
    if not os.path.isfile(path):
        if not os.path.isdir(root):
            os.makedirs(root)
        f = open(path, 'w')
        #print('5')
        f.close()
    with open(f'{path}',mode='r+',encoding='utf-8') as f:
        list_hid = f.readlines()
        f.close()
    dic = {}
    #print(list_hid)
    for hid in list_hid:
        l = hid.replace('\n', '').split(':')
        dic[l[0]] = l[1]
    #print(dic)
    return dic

#保存任务列表(hid):
def SaveTask(group_id,hids):
    path = root + '\\init.txt'
    save_tmp = hids
    with open(f'{path}',mode='w+',encoding='utf-8') as f:
        for k,v in save_tmp.items():
            f.write(f'{k}:{v}\n')
        f.close()

def GetUrl(hid):
    url = "https://api.zsxq.com/v2/users/"+str(hid)+"/topics/footprint"
    #print(url)
    return url

#得到parmars
def GetParmars(group_id, end_time=''):
    params = {
        "count": 20,
        "group_id": group_id,
        "end_time": end_time
    }
    return params

#检查网页是否访问成功
def CheckSucceeded(hid,params):
    for i in range(30):
        resp = GetRequests(GetUrl(hid), params)
        js = json.loads(resp.text)
        if js['succeeded']:
            #print(resp.url)
            print(f'https://wx.zsxq.com/dweb2/index/footprint/{hid}({resp.url})')
            return js
    print('网页访问失败!')
    return {}

#剪切时间格式
def ParserTime(tim):
    if tim == '':
        return ''
    t = tim.split('T')[0] + '(' + tim.split('T')[1].split('.')[0] + ')'
    return t

#剪切网址格式
def ParserWeb(text):
    obj = re.compile(r'<e (?P<href>.*?) />',re.S)
    hrefs = obj.finditer(text)
    for href in hrefs:
        dic = {
            'title': '',
            'href': ''
        }
        first_con = f'<e {href.group("href")} />'
        second_con = str(href.group('href')).replace('"' ,'').split(' ')
        for d in second_con:
            t = unquote(d, 'utf-8').split('=',1)
            if t[0] in dic:
                dic[t[0]] = t[1]
        second_con = f"{dic['title']}"
        if dic['title'] != dic['href']:
            if dic['href']!= '':
                second_con += f"({dic['href']})"
        text = text.replace(f'{first_con}', f"{second_con}").replace(u'\xa0', ' ')
    return text

#获取模板,放置数据
def GetMouldData(type):
    mould = {}
    match type:
        case 'owner':
            mould = {
                'name': '',
                'user_id': 0,
                'location': ''
            }
        case 'question':
            pass
        case 'group':
            mould = {
                'group_id': '',
                'name': '',
                'type': ''
            }
    return mould
#获取页面数据(json)
def GetPageData(context_json,group_id):
    global hid_dic
    data_list = []
    id_list = []
    for data in context_json['resp_data'].get('topics',[]):
        type_ = data.get('type','')
        create_time = ParserTime(data.get('create_time', ''))
        #print(data)
        g_id = str(data.get('group', '').get('group_id', '0'))
        group = {f"{g_id}": f"{data.get('group', '').get('name', '')}"}
        SaveGroup(group)
        dict = {}
        dict['type'] = type_
        dict['time'] = create_time
        dict['group_id'] = g_id
        for key,value in data.items():
            dic = {
                'user': '',
                'text': '',
                'files': [],
                'images': []
            }
            if type(value).__name__ == 'dict':  #判断是否为字典,
                if (str(key) == 'group' or str(key) == 'user_specific'):
                    continue
                # 包含owner 与 text 以及其他东西
                if 'text' in value:
                    text = value['text']
                    dic['text'] = ParserWeb(text)
                if 'owner' in value:
                    owner = GetMouldData('owner')
                    for k,v in value['owner'].items():
                        if k in owner:
                            owner[k] = v
                    dic['user'] = owner
                    id_list.append(str(owner['user_id']))
                if 'files' in value:
                    files_list = value['files']
                    for file in files_list:
                        if 'file_id' in file:
                            dic['files'].append(file['file_id'])
                if 'images' in value:
                    images_list = value['images']
                    for image in images_list:
                        if 'image_id' in image:
                            dic['images'].append(image['image_id'])
                dict[key] = dic
        data_list.append(dict)
    for i in id_list:
        if not i in hid_dic:
            hid_dic[i] = False
    return data_list

#打包数据,设置格式,便于保存
def PackData(data_dic,group_id):
    #print(data_dic)
    type_ = data_dic['type']
    tim = data_dic['time']
    # group = data_dic['group_id']   #{id}
    # if not group_id in group:
    #     return '0'
    res_dic = {
        'files': [], #file
        'images': [], #image
        'answer': f'',  # answer
        'talk': f'',
        'question': f'',
        'texts': f''
    }
    # 分割线
    s = ''
    for i in range(30):
        s += '-'
    #返回固定格式的字符串
    result = ''
    result += f"{type_}  {tim}\n"
    for key,value in data_dic.items():
        if key != 'type' and key != 'time' and key != 'group_id':
            path = data_dic[key]
            if len(path['files']) > 0:
                for f in path['files']:
                    res_dic['files'].append(f)
            if len(path['images']) > 0:
                for i in path['images']:
                    res_dic['images'].append(i)
            path_user = path['user']
            if path_user != '':
                user = f"{path_user['name']}({path_user['location']})[{str(path_user['user_id'])}]\n"
            else :
                user = '匿名用户\n'
            text = f"{path['text']}\n"
            res_dic[key] = f'{user}{text}'
    if len(res_dic['files']) > 0:
        result += f"files:{res_dic['files']}\n"
    if len(res_dic['images']) > 0:
        result += f"images:{res_dic['images']}\n"
    for dic,dat in res_dic.items():
        if dic != 'images' and dic != 'files' and dic != 'answer':
            if dat != '':
                result += f"{dic}:{dat}\n"
    if res_dic['answer'] != '':
        result += f"answer:{res_dic['answer']}\n"
    result += f"{s}\n"
    #print(result)
    return result
    # dic = {
    #     'user': '',
    #     'text': '',
    #     'files': [],
    #     'images': []
    # }
#保存组
def SaveGroup(group_dic):
    #path = GetPath(group_id)
    #print(f'不属于当前组{gro}')
    if not group_dic in group_list:
        group_list.append(group_dic)
        #print(group_list)
        with open(f'group.txt', mode='a+', encoding='utf-8') as g:
            for key, value in group_dic.items():
                g.write(f'{key}:{value}\n')
            g.close()

#保存页面数据
def SavePageData(data_list):
    for data in data_list:
        g_id = data['group_id']
        path = GetPath(g_id)
        with open(f'{path}\\data.txt', mode='a+', encoding='utf-8') as f:
            data_str = PackData(data, g_id)
            f.write(data_str)
        f.close()
    # #获取的内容保存到文件
    # path = GetPath(group_id)
    # with open(f'{path}\\data.txt',mode='a+',encoding='utf-8') as f:
    #     for data in data_list:
    #         data_str = PackData(data, group_id)
    #         if data_str == '0':
    #             continue
    #         #print(data_str)
    #         f.write(data_str)
    #     f.close()

#获取当前要执行的任务
def GetOneTask(hids):
    #print(len(hids))
    #print(hids)
    for hid, va in hids.items():
        #print(va)
        if va != True:
            return hid
    return '-1'

#获取未执行的任务
def GetTasks(hids,star_dic):
    for hid,value in hids.items():
        if not hid in star_dic:
            star_dic[hid]=False
        tmp = (value and star_dic[hid])
        star_dic[hid] = tmp
    return star_dic

#获取最后时间
def GetEndTime(context_json):
    tim = ''
    topic = context_json['resp_data'].get('topics', [])
    if len(topic) > 0:
        tim = topic[-1].get('create_time','')
    return tim

def StartTask(hid,group_id):
    num = 0  # 保存数据数量
    tim = ''  # params的时间
    # 对于当前hid
    while True:
        context = CheckSucceeded(hid, GetParmars(group_id, tim))  # 得到返回成功的json数据
        if context == {}:
            print("加载网页失败")
            break
        tmp = GetEndTime(context)  # 获取params时间,下一页标记
        if tim == tmp:  # 如果时间和上个时间相同,跳出
            break
        tim = tmp
        # 得到页面内容{'title':,'text1':,'text2':}
        data_list = GetPageData(context,group_id)  # 页面所有内容
        num += len(data_list)  # 记录数据
        # 保存内容以及循环
        SavePageData(data_list)  # 保存内容
        if num > 0:
            print(f'已保存{num}条数据')
        if (num + 20) % 20 != 0:  # 可能存在不满一页的情况,数据会重复两次,如果不满一页,说明是最后一页,跳出
            break
        time.sleep(0.5)

if __name__ == '__main__' :
    #初始化过程
    group_id = init_file()
    hid_dic = LoadTask(group_id)  # 导入hid字典
    hid_dic = init_path(hid_dic, group_id)#获取初始hid,list[str] = bool
    num_user = 0 #hid计数
    #print(hid_dic)
    #爬取网页内容
    star_dic = hid_dic
    with ThreadPoolExecutor(50) as t:
        while True:
            #获取hid,没有hid:false则break
            star_dic = GetTasks(hid_dic,star_dic)
            star_hid = GetOneTask(star_dic)
            hid = star_hid
            if hid == '-1':
                print("本次任务结束")
                break
            star_dic[star_hid] = True
            #任务开始,返回完成数量
            t.submit(StartTask,hid = hid,group_id = group_id)
            #num = StartTask(hid,group_id)
            # 当前hid结束任务
            hid_dic[hid] = True
            num_user += 1
            #保存任务
            SaveTask(group_id, hid_dic)
            time.sleep(0.2)
            #结果输出
        print(f'当前用户 {hid} 已完成')
    print(f'共爬取 {num_user} 位用户')

其他:

        部分星球ID:

        

552521181154:齐俊杰的粉丝群
15522245182822:xin的自我成长星球
51112281418554:款儿姐和她的朋友们
88885855851412:网文素材写作
454548818428:老齐的读书圈
48411185245528:齐俊杰的小白集训营
15522884542882:漫画动漫
15528188184852:神经病
51128855212844:网文
88885518484582:大年和他的逆袭网文作者们
281815125451:螺丝钉学院
555882842814:明哥读者闭门论坛
142552854252:股楼大揭
48411542128828:海边的西塞罗
51122254118414:齐俊杰的高净值社群
15528144888282:老徐的高端私密圈子
28855282822551:财富管理碎碎念(小伙伴群)
15528821844152:学习本本
51288818112524:猫叔的私密圈
88511141441242:猫叔视觉
48411811245828:DFT知识星球
51128851541484:天行之道
551148585424:飞说不可
88851488128282:文渊策略
15522458128822:文渊读书
458522225218:珍大户的经济圈
28855815441441:Excel进化岛
285821581:手机摄影
88851451412452:快乐星球
28858558828821:呼神护卫的魔法空间
28885518844481:诺兰99
48884411854158:恒星通讯社
48418884588288:JavaGuide&Java面试交流圈
51121245828244:龙晓
88511254548852:光明小课桌
15528854251512:米浴小窝
15522485444412:梁靠谱陪你长命百岁
88855585542182:好好学习  天天向上
28855842855111:ToB老人家
28855811825151:稳步前进
88855551144282:🔶齐俊杰🔶齐俊杰的粉丝群
48418252254288:【停更】价值投资圈
48411514811858:韭菜俱乐部
51122858285514:知识星球
15288412141512:曼心理空间
141288541222:约瑟聊股
28514145524151:叉烧写作笔记
15288451415852:读书.投资.生活
15528822285222:财经分享
51122554184184:老潘的读后感
15522518184842:infp乐园
2442824211:新能源电池圈
51285125558284:灵哥财富课
15284852111852:胶易者
15552288455552:蓝海
88518884158222:随芯所欲
142858585512:吾爱IC社区
458814425818:PowerBI朋友圈(P圈)
455545555228:财会成长学苑
455424215118:幸存指南
28518485241511:观雨大神经
51284524542284:达叔天演论
28885518515441:考研保研上岸团
142544888112:智享汽车圈
28512521552851:ETF定投十年十倍
48841182825428:财务自由之路
51128814145214:财务自由
1824528822:生财有术
554428821284:玩赚新媒
2421112121:帅张和他的朋友们
552881412544:地产八卦男的星球
51122228428424:悟道
15288455451182:修明观察
51128815151184:聚高筹团
15528854212882:聚高筹团会员星
51128841482424:苏丹理财
51284815188224:空地交流小众版
15284525515282:愚不知的世界
28511184581451:齐俊杰的小白训练营
88514828411552:蜗牛HUA金融
15522814124182:老黄的投资策略群
51122814514144:共同富裕
51122522552524:硬件工程师进阶营地
51128854158414:忙总思想学习会
51288814441444:东哥论基
88855258815152:葆学习之心,寻自由之路
51288115412514:老路谈升学
15528855828542:定投出奇迹
88855455118812:c语言问题解答
48412585228218:剽悍星球
88851184214252:阿升
15528812848222:阿马蒂亚
51121215481424:奶爸套利亚马逊
48844128182128:小吴的朋友圈
15288424581512:你好!读书学习。
15522588542882:逆熵成长
88855584241412:樱桃读书会
48415418184888:财商读书圈
51128455881884:价值投资·十年共行
51288528218524:丝瓜
48841211542458:自由之路
88514254211812:有财人
822484528412:宠物星球
28851142511111:笑天
28858521821211:霍笑天
28885518124541:WORLD URINETHERAPY ASSOCIATION
554518521584:是不是很酷(免费)
48884421585188:灵方尿疗
51284458888154:Java大数据(限免)
48411585215188:自由职业之路
28858512242221:就爱做白日梦
518181148814:刘润 • 进化岛
51288818115214:成长笔记
88511115251822:学编程能干嘛
88855581255852:杨德龙粉丝免费交流圈
555184444414:Datawhale
141415151512:互联网怪盗团
51122412122544:数字后端顶级技术分享
51121254144424:【随寓而安】成长日记
28851154282411:米斯特.T
48848444115448:AI接管世界
51128814281854:闲鱼练金术
15288851285442:齐俊杰小白,5
48848444885258:池建强·让时间为你证明
48415258514258:无肉不欢的读书圈
552844284254:龙头
15528154845422:路的尽头
454581514558:365玩卡社群问答
48844441258518:大龄程序员
48844441258528:大龄码农
51112122585214:投机-工作-生活
28855144511181:MOSIC
224228548221:A老齐读书圈🧧齐俊杰粉丝优惠
48411125488128:玄水
51122181242224:小财神限量星球
88858518418412:齐俊杰的粉丝群
51121281481584:齐俊杰的粉丝群
48848418225588:齐俊杰的粉丝群
48844485485828:优惠加返现
15522814824522:趋势投资
88855581842142:Autumn的星球空间
51122182425284:青衣
88855458258242:曼心理空间
48411544551188:茉莉清雅的学习圈
458128585488:中产的财务自由之路
15528182552812:微积分和他的朋友们
88518185454252:蓝鲸报告
51122145882244:一图千金(牧牛股票实战)
88855554844882:投基自然保护区
28512482822221:养只金鹅下金蛋
158148512412:房叔的楼市小密圈
51128841114524:网文技巧随笔
481844185118:北京买房那些事
28511551551141:自由写作&成长营
28511184141141:写作交流小队
28855251142451:齐俊杰的粉丝
48841258548118:科研狗的生存手册
8452842842:装修33天
15522582858512:此时此刻
28855254541251:书法之路  一起前行
452441454848:互联网的解忧杂货铺
1855225152:投研帮亲友团
88851122451252:亚马逊干硬知识总结
15552282221412:羽毛笔
28855121882121:明途申论社群
48844155248518:明途公考互助
48841145144228:读书分享圈(免费)
288452121:星球推荐(免费)
15288882444212:理财投资知识
554548588454:价值趋势社
15522254454422:优惠返现齐俊杰小白营小白营集训
28855485458281:点妈的理财经
458558282418:佛医堂◎云道场
88855255221542:塔塔娃
28518544251111:体外诊断价值圈
51122854852514:达叔经济学
28858518224551:价值投资
28855524881821:自留地
48411182848288:价值投资123
15528821842222:育儿群
88858558215452:自觉觉他
48841211241218:投资学习
51122181215124:宝妈加油站
51288514544114:个人发展共读会
222451552551:愚公掘金
51122888842484:四为居士的读书圈
28851441428211:唯为风月
15284285544812:陈老师的产品宝藏
15288224818242:奶爸创富圈
15528851158252:小白的投资之路
28511222442181:?
28518511148841:南半球聊财经
452558585828:步枫的碎碎念
141412151182:米宅深圳
28851145852211:记录生活0
825224184222:黑马投资圈
88851428458242:小杨树祝你完美升级为妈妈
28855555854281:别让星球成为骗子割韭私域圣地
48884411221558:成长星球
51122515842554:言行集思录
554441218444:明月的财务自由之路
88518425512522:敏哥和他的朋友们
88511825151142:代码随想录
88511142558822:帅张读书会
28855115825551:《做点事》共读营
28514812815521:数据、用户增长、商业化PM精英阁
825441824142:花火
51288182222224:帅张读书会(内测)
88855582241112:财务会计圈
15525258428282:敏哥沃尔玛大航海
15281815114552:白酒茅台交易信息
88511215512142:Studying X
48841144584528:吴可爱🥰学习2班
48848455454158:笨笨爱吃糖
481141225428:芋道源码&&架构
51122888188114:脸叔星球第八季
15284858845222:刻意练习元认知能力
48418248245828:肉肉的价值观故事
15522221481512:老张的投资交流圈
51122885241424:优秀教师群
88855255215252:慢慢学重症
144418544522:茶话股经
51288554242114:齐俊杰粉丝群老齐读书圈
48884421228888:厦大航发原理与设计
88858525555142:精读书小组
28885518581581:天空
15528812581122:黑洞
51128441851214:一拖二集中营
88855811145422:冰雹英语私塾
281148122241:我的房产研习社
88885515881542:马扎的成长圈
28511124842851:投资小密圈
15281284818582:个人发展·第二曲线
51122228841244:小邱说财报
454158412418:人生是滚雪球
555214111584:多财多易
28514141455221:老胡电商圈子
51281828421524:青柠学社
452425421218:董小姐的朋友圈
452442854428:人生是滚雪球的朋友们
2182845521:DevOpenClub Pro
15528155485552:利威股权VIP社群
28511184484821:平民创业手册
28851418888281:楂楂王
554255514524:理财师八宝的朋友圈
48412128554558:投资理财免费交流
452412542548:李自然的朋友们
88858528114812:老刘的读书笔记
145424185582:李迅雷宏观视角
88511182488452:定慧之道
158151485252:无往不利
142111444522:低调至上
15288854514812:道势投资
48844581451158:乐活的修行
48411111815248:赫敏格兰杰
28511215184141:眼镜时代
88855585858422:尹晨直播带货俱乐部
142848125222:星球学院
51122814515844:注册建筑规划研究所
518121522114:小丹尼
881125452412:唐韧的产品星球
51128815428144:龙门股道🌟
824282884422:天禄投资基础星
15522411282552:听书
552542121884:跨境电商卖家成长圈
28851441852551:心理沙盘
28851152188511:挖人生的金矿
48841285222188:Mike增强学院
224228451281:认识商业
4148444128:小马宋商业观察
158811245222:小程序淘金
5581142244:吴主任
4251122518:互联网知识经济社群
728151117:小众消息和他的朋友们
15528855822412:123
48412224555128:hpj学习收藏
28885518145241:2023学习笔记
48844118141228:共读社
788255527:产品学徒
51285524218214:顾问式销售星球
28855282841441:大鱼鉴水
518852118114:冯学荣的私密圈子
88855254542222:启四和他的朋友们
51128428582854:阿拉专的粉丝群
15525251585212:游牧夫妻和朋友们
15285114845882:妈网房产朱七七
51284185822584:自习室
88851122844482:过路客
552445551254:日落之海
48418882812258:康庄大道
28511118221211:老季的知识星球
144215414582:纯阳财务自由培训社
28511184818241:龙门高考历史课
28855551142851:龙门认知
15522858228522:好好学习天天向上
824254182822:黑马铁粉群
28855148218841:昊东财商读书会
48884418425148:快乐星球
15525225551122:小晴老师的读书屋
555225242544:2023年AI算法岗求职群
15288851521542:小白集训营
48884421511558:逆麟
822451554112:有三AI
15552288544222:格局杨的轻奢严选和知识分享社群
88851124522182:子曰读书会
51284285211884:全球人菁英圈
48411541481528:军哥的房产融投圈
881115424242:星星佬看楼市
15281184124582:芯片设计
15281421248582:每日精进(免费)
4224842218:“辉哥奇谭”读者群
15528158221282:佯过
88851454225142:应用PaaS小组
48412215512418:菜心设计铺
88511822141542:长弓小子设计思享
48841224851888:罗耀最强社群
2152221441:交互设计小厨房
28855554558111:设计师的求职指南
5421245554:产品疯人院
88855485844212:螃蟹的干货分享星球
51128414118254:xenoverse
28512441542151:小K的股票价值投资🌍
51284825258484:小K的经济学(理财知识)🌍
15525251584422:复盘
88855451182882:高明全的个人星球
15552282821182:击穿书评写作
51122254214254:本食为民的创业日常
88858581545522:测绘测量交流群
824448818152:招财星
1185888122:运营狗工作日记
8185545222:木友圈-PPT训练营
48844528521148:语言学习 领络数据英语
51128818248514:乒乓球
51128841151284:今日份成长
51122885215844:五毛财经外媒
15522411255282:青杨柳
88855451812452:戎评百万实盘进阶圈
15522251824412:自由书写村&心灵疗愈站
48841221422228:诸君的理财顾问
15522514455422:投资之路
88855285254822:七里记
48411518415218:小K金融圈:名校留学&实习内推
88855528418552:区域医疗信息化
48844582428188:敏哥TK大航海
48844482451458:尊重知识努力学习
28855222842251:数据查询
15525285822422:老苗观世觉
48844818885828:价值陪伴成长
15522452421282:南山小密圈
15285514811842:躺着赚钱
88511184524852:建筑结构
15525222182812:陈读英语
15525222541182:从入门到入土:魔鬼硬件训练营
88511124542242:上可常识与闲聊
225255828521:基少成多
88885518212442:提高情商小记录
15288418855182:理财知识素材
88511242888222:秋燕随笔(理财干货)
28511155821851:经典财经书籍解读
48844552145488:月积年累
88851415242152:小朱有话说
48844182118528:食品营养与安全
28855555485481:不对任何人好,人都是贱种
28858554422511:浮尘楼
88511155824152:学方法
48415224418458:赵梓昕读书俱乐部
15525228151522:投资内参
48848484544818:安全小锅的学习群
88511825155222:理财精华
15288412284482:老齐读书文档
28851451581821:经济投资疑问答记
88851415445112:文史哲
51128814248444:Tom真不想看你亏钱
15522425244412:可转债轮动&套利(限时免费)
28851184121451:DL知
48848444558558:缘家一公里商业圈
51122582525124:爱迪生星球
455514515818:桃花潭
824481822482:汤质的茶馆
15522125214422:空谈社
142848511412:武汉楼市~武汉裴sir1
828288122112:觉悟社
881855145552:重庆楼
481422882518:重庆新一线城市
15284148215522:关注孩子成长
15284581241222:阿丁小声说
48844581255228:小沐网络随笔
28512121158541:清和社
28511241145841:Peter
51285485258154:运营研究社
15522245881812:量化分析与程序交易
88855281812252:lz13yiyuan
28851418588411:萱宝
48848485158218:陈天宇宙支付圈
88851148421522:成长之声
15288451214812:恒星
15528851818112:齐骏杰
551158855224:定投指数基金
88518452255112:零城逆影组合跟投星球
88855258825882:会长和他的朋友们
51288155454414:老齐读书圈&齐俊杰粉丝群福利
48412142584588:光伏学习
144424418282:野生运营
15528828452212:粥左罗•新媒体变现圈第二期
518281245884:TIME研究群
88512144458242:小丰文案方法研习社
51285842881284:旗舰定投打新小组
28518484112211:杭州房哥
15522444825822:随笔
48411182241188:辉哥财经日记
15528185245212:未雨绸缪
48844828814448:读书笔记后花园
15522815551252:持续写作,提升赚钱能力
145442414242:安人书院
481841558588:城市发掘者
28855551118851:螺丝钉
281511214851:猫叔聊地产
51112281848114:竹子的女频经验

爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值