爬虫,爬取一个网页获取到了网页的链接,如何再接着爬取链接的内容
就是我先爬取到豆瓣电影top250里面的数据,然后我想再接着爬取电影详情页的内容
你把前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/
将 文本化的经纬度和文本化的经纬度梯度 生成词频矩阵,进行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.')