解决方案:二、安居客数据采集
优采云 发布时间: 2022-10-05 04:13解决方案:二、安居客数据采集
执行以下代码:
find('div', {'id':'listnav'}).findAll('a', href=re.compile('(/free/inha/)[0-9]+'))
输出结果:
/free/inha/1/
/free/inha/2/
/free/inha/3/
/free/inha/4/
/free/inha/5/
/free/inha/4619/
/free/inha/4620/
结果与前面的示例输出相同,这可能会让您感到困惑。不要使用简单的方法?说了不止一次,如果没有特殊要求,请尝试“使标签的选择更具体”,可以尝试去掉第一个find语句,重新运行程序,不出意外,输出结果还是相同。但是,你可以明显感觉到程序变得“慢”了(相对而言)。页面上的标签越多,这种感觉就越明显。因此,使标签的选择更加具体,不仅可以提高程序的可靠性,还可以提高 采集 的速度(在大多数情况下)。
2.5 完整代码
'''
作者:高玉涵
时间:2022.5.27 13:12
说明:爬虫第二版
'''
import socket
import re
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTable(bsObj):
'''
获取表格
:param bs 对象
:return 返回表格对象
'''
try:
table = bsObj.table
except AttributeError as e:
return None
return table
def getAgentData(table):
# 抓取到代理数据
agent_data = []
# 获取表头
theads = getThead(table)
try:
# 获取所有行
rows = table.findAll('tr')
except AttributeError as e:
print("TR 标签未找到!")
return None
else:
for row in rows:
# 存放代理信息
agent = {}
for t in theads:
# 逐行查找与列对应的数据
text = row.find('td', {'data-title':t})
if text is not None:
agent.setdefault(t, text.get_text())
if len(agent) != 0:
agent_data.append(agent)
return agent_data
<p>
def getThead(table):
# 存放获取的表头值
theads = []
try:
# 遍历表格头子标签
for h in table.thead.tr.children:
# 提取标签内的值去掉前后空格
text = h.get_text().replace(" ","")
# 忽略不可见的换行符
if text != '\n':
theads.append(text)
except AttributeError as e:
print("TR 标签未找到!")
return None
else:
return theads
def getUrl(url):
'''
获取 URL
:param url 地址
:return 返回 bs 对象
'''
try:
html = urlopen(url)
except HTTPError as e:
return None
except socket.error as e:
print('socket')
return None
try:
bsObj = BeautifulSoup(html.read(), 'html.parser')
except AttributeError as e:
return None
return bsObj
def getPageCount(bsObj):
'''
获取底部跳转页面数
'''
try:
links = bsObj.find('div', {'id':'listnav'}).findAll('a',
href=re.compile('(/free/inha/)[0-9]+'))
pageCount = int(links[-1].get_text())
except AttributeError:
return None
except ValueError:
return None
return pageCount
if __name__ == '__main__':
# 免费代理
url = 'https://free.kuaidaili.com/free/inha/'
bsObj = getUrl(url)
if bsObj == None:
print(f"访问:{url} 失败。")
exit(1)
pageCount = getPageCount(bsObj)
if pageCount == None:
print("获取页面数失败。")
exit(1)
print(f"目标:{url} 共发现:{pageCount} 个页面。")
user_choice = input('是否继续(y/n):')
if user_choice not in('y','Y'):
exit(0)
retry = 0 # 重试次数,避免进入死循环
while(True):
if retry >= 3:
exit(1)
try:
retry += 1
user_count = input('请输入需要爬取的页数(默认:3)')
if user_count == "":
user_count = 3
break
elif int(user_count) > pageCount:
print("范围超过最大值!")
continue
except ValueError:
continue
agent_list = [] # 代理列表
'''
网页索引从 1 开始,
user_count + 1,是为了符号人类习惯,不然会存在差 1
range(...,到结束值,但不包括结束值)
'''
for i in range(1, user_count + 1):
bsObj = getUrl(url + str(i))
if bsObj == None:
print(f"访问:{url} 失败。")
exit(1)
table = getTable(bsObj)
if table == None:
print(f"table 标签未发现。")
exit(1)
print(f"采集第 {i} 页,共 {user_count - i} 个页面等待处理,", end="")
agents = getAgentData(table)
agent_list.extend(agents)
print(f"成功采集到 {len(agent_list)} 条数据")
</p>
输出结果:
python craw_table2.py
目标:https://free.kuaidaili.com/free/inha/ 共发现:4624 个页面。
是否继续(y/n):y
请输入需要爬取的页数(默认:3)
采集第 1 页,共 2 个页面等待处理,成功采集到 15 条数据
采集第 2 页,共 1 个页面等待处理,成功采集到 30 条数据
采集第 3 页,共 0 个页面等待处理,成功采集到 45 条数据
3. 下一节,通过互联网采集
我们稍后将构建的网络爬虫将跟随链接从一个页面跳转到另一个页面。他们不再只在网站内部,而是跟随外部链接,这将是一个新的挑战。互联网采集比单个域名采集难多了——不同的网站有非常不同的布局。这意味着我们必须非常灵活地寻找我们正在寻找的信息以及我们如何寻找它。
看
Python采集网络数据(一):BeautifulSoup
解决方案:电商类产品搜索功能如何优化?
搜索功能对于电子商务产品尤为重要。当用户带着明确的目的去搜索自己需要的产品时,并没有得到想要的结果,这在很大程度上直接影响了用户对产品的体验。. 本文作者结合自身经验,探讨如何优化电商产品的搜索功能。
说正题之前,想跟大家分享一下前段时间梁宁产品30讲中对用户画像的描述,里面提到了一组经典的用户画像大明、奔奔、小贤:大明对应对的用户有一个清楚了解他们的需求 对自己想要什么有非常清晰的头脑;傻瓜式人对他们的需求只有模糊和笼统的指导,而且不清楚;至于小仙,大家可以猜到,主要是因为空闲时间是那种想打发时间的用户。
为什么要和大家分享这组用户画像?
当然和我的 文章 内容有关。作者供职于一家toB saas公司。加入公司后不久,我被指派负责优化公司尚未正式上线的采购模块的搜索功能。
接上一段,很明显面对B端代购产品的用户都是大明,而且都是带着明确的目标去购买,正是因为目标明确。因此,在这三类用户中,大明对搜索的依赖程度最高,他们的需求也是最简单的——以实惠的价格快速找到自己想要的东西。因此,搜索的好坏直接影响到产品能否满足用户的需求。
1、第三方API接口面临的质量差问题
因为是小公司,刚建采购平台的时候对接的是一个电商采购,但是对方提供的搜索界面质量差,分词不准确,召回率低或者数量太大比如:让你给周杰伦回电话,要么周杰伦,周杰伦,周杰伦会回来,要么没人回,要么你无法应付太多无关的人回电话。总之,问题太多了。过去的对策。
自建搜索缺人缺资源
第三方搜索界面太差,所以在我来公司之前,公司已经做了自己的搜索功能,但是人力物力有限,没有多余的资源。在赶往前线的路上,我顾不得这条路上的大坑,做了一番未完成的搜索。
虽然分词词库是基于ik开源词库,分词略有提升,召回率也有保证,但分词结果仍然不准确,无法实现语义识别,无法满足大明用户的基本需求。
我们以周杰伦为例:不仅有周杰伦、周杰伦和周杰伦,还有同名的猫狗。加入公司后,人缺资源的局面没有丝毫改变。真是一个赤裸裸的指挥官。
老板的期望
无论你从事什么职业或职业,老板都是不可回避的存在。在做产品的时候尤其如此,因为很多小公司的老板基本上都是做产品的,所以和你的产品意见相左是家常便饭。
对于公司的产品搜索功能,我们老板的期望还是比较适中的,能仅次于国内知名电商平台的搜索体验就好了,不是100分,99分。我的天,这真的让我咬牙切齿。
就我个人的体验来说,公司购买的搜索功能基本都是40分或者50分的失败。再加上公司没有经过专业搜索的产品,而且我也是新人,技术资源支持不够,所以就算想杀小偷也无能为力。
问题总是一个接一个,骂人也得骂,但事情总得做。毕竟,你必须向老板发表声明。即使面对不可能完成的任务,也必须有不破坏楼兰、永不偿还的决心。
冷静思考:你面临的问题主要集中在几个方面:搜索界面、分词、语义识别。
基于这几点,通过几次关于产品技术的讨论会,可以认为现阶段可以实施的优化方案如下:
三、优化方案 1.优化ik分词词库
大多数电商平台使用分词来提高产品的召回率和相关性排名,而分词词库是保证分词准确的关键。在上面的周杰伦的例子中,官方回忆起分词词典中出现了周杰伦、周杰伦等无效词。
ik 词库分为基本词库、扩展词库和停用词。分词是基于基本词库中的词。扩展词库是对基本词库的补充,将停用词中的词过滤掉。也就是说,优化ik词库采用了三步走的策略。
2.关键词绑定类别辅助语义识别
语义识别就是让系统召回周杰伦,系统知道周杰伦是男明星,不会再把其他同名的人召回给你。目前我司的能力还不能从技术层面实现搜索的语义识别,只会召回所有匹配到标题名称中收录搜索关键词的产品。
为此,我们只能手动将关键词与类别关联起来,相当于标记了关键词。寻找周杰伦只会在男明星类别中被召回,保证了搜索结果。相关程度。
概括
除了这些,搜索功能的优化还包括索引、排序等。以上优化方案是根据我司的实际情况,也是为了满足大明用户的基本需求(你可以搜索到你想要的) 作为出发点,虽然这些措施对搜索功能的优化起到了一定的作用,但最好的解决办法还是找到可靠的接口或者可靠的分词词库。
通过写文章,我想有个小地方学习和交流新产品新人或老板。同时,由于产品经验和专业的限制,文章中可能有表达不准确或错误的地方,希望大家见谅,及时纠正!
我是0岁产品威廉!希望耶路子的产品不要走丢!
这篇文章由@attack 的 PD 原创 发表于每个人都是产品经理。未经许可禁止复制
图片来自Pexels,基于CC0协议