爬虫,爬取一个网页获取到了网页的链接,如何再接着爬取链接的内容

爬虫,爬取一个网页获取到了网页的链接,如何再接着爬取链接的内容
就是我先爬取到豆瓣电影top250里面的数据,然后我想再接着爬取电影详情页的内容

img

img

你把前250电影的ID存储起来,然后去请求对应的详情URL来获取。
比如 前三名的ID分别是:1292052、1291546、1292720
所以详情页URL是:
https://movie.douban.com/subject/1292052/
https://movie.douban.com/subject/1291546/
https://movie.douban.com/subject/1292720/

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7741588
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:豆瓣电影Top250数据爬取、数据分析及数据可视化
  • 除此之外, 这篇博客: 智慧海洋建设TOP_1方案学习笔记中的 基于轨迹序列绝对和相对位置的复合向量编码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    将 文本化的经纬度和文本化的经纬度梯度 生成词频矩阵,进行LSA降维,降维后30维。

    先定义下面三个工具函数:

    (1)geohash_encode将经纬度坐标转换成字符串相近的位置字符串相同。

    def geohash_encode(latitude, longitude, precision=12):
        """
        Encode a position given in float arguments latitude, longitude to
        a geohash which will have the character count precision.
        """
        lat_interval, lon_interval = (-90.0, 90.0), (-180.0, 180.0)
        base32 = '0123456789bcdefghjkmnpqrstuvwxyz'
        geohash = []
        bits = [16, 8, 4, 2, 1]
        bit = 0
        ch = 0
        even = True
        while len(geohash) < precision:
            if even:
                mid = (lon_interval[0] + lon_interval[1]) / 2
                if longitude > mid:
                    ch |= bits[bit]
                    lon_interval = (mid, lon_interval[1])
                else:
                    lon_interval = (lon_interval[0], mid)
            else:
                mid = (lat_interval[0] + lat_interval[1]) / 2
                if latitude > mid:
                    ch |= bits[bit]
                    lat_interval = (mid, lat_interval[1])
                else:
                    lat_interval = (lat_interval[0], mid)
            even = not even
            if bit < 4:
                bit += 1
            else:
                geohash += base32[ch]
                bit = 0
                ch = 0
        return ''.join(geohash)
    

    (2)tfidf对文本进行tfidf词频特征 ,并利用LSA进行潜在语义分析,也可以理解为用svd降维。每个文本生成output_num维度的向量。

    
    
    def tfidf(input_values, output_num, output_prefix, seed=1024):
        # 生成文本Tfidf矩阵,使用TF-IDF对文本进行预处理,将文本化为向量的表示形式,shape=(文本数,词汇数)
        tfidf_enc = TfidfVectorizer()
        tfidf_vec = tfidf_enc.fit_transform(input_values)
        # print('所有文本的关键字',tfidf_enc.get_feature_names())
    
        # print('词频矩阵的结果',tfidf_vec.toarray())
        
        # 对shape=(文本数,词汇数)的矩阵进行降维,
        #生成Matrix(文本数,主题数)xMatrix(文本数,主题数),主题数远小于词汇数
        # truncatedSVD作用于sklearn.feature_extraction.text向量化后返回的 term count/tf-idf矩阵。在这种情况下又被成为LSA( latent semantic analysis)
        # LSA潜在语义分析,生成主题数为30维,
        svd_tmp = TruncatedSVD(n_components=output_num, n_iter=20, random_state=seed)
        svd_tmp = svd_tmp.fit_transform(tfidf_vec)
        svd_tmp = pd.DataFrame(svd_tmp)
        svd_tmp.columns = ['{}_tfidf_{}'.format(output_prefix, i) for i in range(output_num)]
        return svd_tmp
    

    (3)count2vec与tfidf功能相似,没有使用tfidf进行词频统计,直接使用计数对词频统计。

    def count2vec(input_values, output_num, output_prefix, seed=1024):
        # CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵
        # 生成文本词频矩阵
        count_enc = CountVectorizer()
        count_vec = count_enc.fit_transform(input_values)
        # truncatedSVD作用于sklearn.feature_extraction.text向量化后返回的 term count/tf-idf矩阵。在这种情况下又被成为LSA( latent semantic analysis)
        # LSA潜在语义分析,生成主题数为30维,
        svd_tmp = TruncatedSVD(n_components=output_num, n_iter=20, random_state=seed)
        svd_tmp = svd_tmp.fit_transform(count_vec)
        svd_tmp = pd.DataFrame(svd_tmp)
        svd_tmp.columns = ['{}_countvec_{}'.format(output_prefix, i) for i in range(output_num)]
        return svd_tmp
    

    利用gaohash_encode 将每条数据得经纬度转为长度为7得字符串,相近的位置字符串相近

    
    df['lat_lon'] = df.apply(lambda x:geohash_encode(x['lat'], x['lon'], 7), axis=1)
    
    # 将每一个ID对应的所有的lat_lon 存到list中,ID [xvkwu60,xvkwu60,xvkwu60,xvkwu60,vkwu60 xvkwu6]
    tmp = df.groupby('ID')['lat_lon'].agg(list).reset_index() # agg聚合的结果是一个值(一个分组一个值)。
    # list 转字符串 并以空格分隔, ID xvkwu60 xvkwu60 xvkwu60 xvkwu60 xvkwu60 xvkwu6
    tmp['lat_lon'] = tmp['lat_lon'].apply(lambda x: ' '.join(x))
    print('经纬度文本化的结果:',tmp)
    

    在这里插入图片描述

    将文本化的经纬度生成的矩阵,进行LSA降维,得到30维特征。

    # 将文本化的经纬度生成词向量
    tfidf_tmp = tfidf(tmp['lat_lon'], 30, 'lat_lon')
    count_tmp = count2vec(tmp['lat_lon'], 30, 'lat_lon')
    
    # 合并两个词嵌入的结果,60个特征
    tfidf_df = pd.concat([tmp[['ID']],tfidf_tmp,count_tmp],axis=1)
    
    # 将这60个特征加入到group_df中
    group_df = group_df.merge(tfidf_df,on='ID',how='left')
    print('geohash tfidf finished.特征个数',len(group_df.columns))
    

    生成每个ID所有数据经度梯度_维度梯度组合特征

    # agg聚合的结果是一个值(一个分组一个值),所以下面代码执行返回一个ID,以及ID对应的lat 的梯度list
    # 0	 [0.0, 0.0, 3.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, ..
    grad_df = df.groupby('ID')['lat'].apply(lambda x: np.gradient(x)).reset_index()
    grad_df['lon'] = df.groupby('ID')['lon'].apply(lambda x: np.gradient(x)).reset_index()['lon']
    grad_df['lat'] = grad_df['lat'].apply(lambda x: np.round(x, 4))
    grad_df['lon'] = grad_df['lon'].apply(lambda x: np.round(x, 4))
    
    # 注意下面这行format zip用法,每一时刻的经纬度的梯度会一一匹配。
    # 最后结果 -0.0058_0.0034 -0.0058_0.0034 -0.0047_0.0044 -... 经度梯度_维度梯度
    grad_df['grad'] = grad_df.apply( lambda x: ' '.join(['{}_{}'.format(z[0],z[1]) for z in zip(x['lat'],x['lon'])]),axis=1)
    print(grad_df['grad'])
    

    在这里插入图片描述

    生成经纬度梯度tfidf矩阵,降维

    tfidf_tmp = tfidf(grad_df['grad'], 30, 'grad')
    grad_tfidf = pd.concat([grad_df[['ID']], tfidf_tmp], axis=1)
    group_df = group_df.merge(grad_tfidf, on='ID', how='left')
    print('gradient tfidf finished.')
    

    随机抽取10%的经纬度文本,生成的矩阵,进行LSA降维,得到30维特征。

    tmp = df.groupby('ID')['lat_lon'].apply(lambda x: x.sample(frac=0.1, random_state=1)).reset_index()
    del tmp['level_1']
    tmp.columns = ['ID','sample']
    tmp = tmp.groupby('ID')['sample'].agg(list).reset_index()
    tmp['sample'] = tmp['sample'].apply(lambda x: ' '.join(x))
    
    tfidf_tmp = tfidf(tmp['sample'], 30, 'sample')
    sample_tfidf= pd.concat([tmp[['ID']], tfidf_tmp], axis=1)
    group_df = group_df.merge(sample_tfidf, on='ID', how='left')
    print('sample tfidf finished.')    
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^