xhr如何获取百度百科的内容

xhr如何获取百度百科的内容,第1张

最近遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释

我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果

但是自己又没有心思做这样一个数据库,于是就想到了百度百科这么一个现成的 “数据库”

下面我们就通过 urllib 和 xpath 来获取百度百科的内容

1、爬取百度百科

百度百科是一个静态网页,爬取起来很简单,而且请求参数可以直接放在 URL 里面,例如:

可以说是十分方便,也不多说,直接放代码,有不明白的地方可以看看注释:

如果对于 urllib 的使用不太清楚,可以参考 爬虫系列(三) urllib的基本使用

如果对于 xpath 的使用不太清楚,可以参考 爬虫系列(九) xpath的基本使用

import urllib.request

import urllib.parse

from lxml import etree

def query(content):

# 请求地址

url = 'https://baike.baidu.com/item/' + urllib.parse.quote(content)

# 请求头部

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'

}

# 利用请求地址和请求头部构造请求对象

req = urllib.request.Request(url=url, headers=headers, method='GET')

# 发送请求,获得响应

response = urllib.request.urlopen(req)

# 读取响应,获得文本

text = response.read()().decode('utf-8')

# 构造 _Element 对象

html = etree.HTML(text)

# 使用 xpath 匹配数据,得到匹配字符串列表

sen_list = html.xpath('//div[contains(@class,"lemma-summary") or contains(@class,"lemmaWgt-lemmaSummary")]//text()')

# 过滤数据,去掉空白

sen_list_after_filter = [item.strip(' ') for item in sen_list]

# 将字符串列表连成字符串并返回

return ''.join(sen_list_after_filter)

if __name__ == '__main__':

while (True):

content = input('查询词语:')

result = query(content)

print("查询结果:%s" % result)

效果演示:

2、爬取维基百科

上面的确是可以解决一些问题,但是如果用户查询为英文怎么办?我们知道,百度百科一般极少收录英文词条

类似的,很容易想到爬取维基百科,思路也和爬取百度百科一样,只需处理一下请求地址和返回结果就好

下面也是直接放上代码,有不明白的地方可以看看注释:

from lxml import etree

import urllib.request

import urllib.parse

def query(content):

# 请求地址

url = 'https://en.wikipedia.org/wiki/' + content

# 请求头部

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'

}

# 利用请求地址和请求头部构造请求对象

req = urllib.request.Request(url=url, headers=headers, method='GET')

# 发送请求,获得响应

response = urllib.request.urlopen(req)

# 读取响应,获得文本

text = response.read().decode('utf-8')

# 构造 _Element 对象

html = etree.HTML(text)

# 使用 xpath 匹配数据,得到

下所有的子节点对象

obj_list = html.xpath('//div[@class="mw-parser-output"]/*')

# 在所有的子节点对象中获取有用的

节点对象

for i in range(0,len(obj_list)):

if 'p' == obj_list[i].tag:

start = i

break

for i in range(start,len(obj_list)):

if 'p' != obj_list[i].tag:

end = i

break

p_list = obj_list[start:end]

# 使用 xpath 匹配数据,得到

下所有的文本节点对象

sen_list_list = [obj.xpath('.//text()') for obj in p_list]

# 将文本节点对象转化为字符串列表

sen_list = [sen.encode('utf-8').decode() for sen_list in sen_list_list for sen in sen_list]

# 过滤数据,去掉空白

sen_list_after_filter = [item.strip(' ') for item in sen_list]

# 将字符串列表连成字符串并返回

return ''.join(sen_list_after_filter)

if __name__ == '__main__':

while (True):

content = input('Word: ')

result = query(content)

print("Result: %s" % result)

百度蜘蛛,英文名是“baiduspider”是百度搜索引擎的一个自动程序。它的作用是访问互联网上的html网页,建立索引数据库,使用户能在百度搜索引擎中搜索到您网站的网页。

常见问题

1.Baiduspider对一个网站服务器造成的访问压力如何?

答:Baiduspider会自动根据服务器的负载能力调节访问密度。在连续访问一段时间后,Baiduspider会暂停一会,以防止增大服务器的访问压力。所以在一般情况下,Baiduspider对您网站的服务器不会造成过大压力。

2.为什么Baiduspider不停的抓取我的网站?

答:对于您网站上新产生的或者持续更新的页面,Baiduspider会持续抓取。此外,您也可以检查网站访问日志中Baiduspider的访问是否正常,以防止有人恶意冒充Baiduspider来频繁抓取您的网站。 如果您发现Baiduspider非正常抓取您的网站,请反馈至[email protected],并请尽量给出Baiduspider对贵站的访问日志,以便于我们跟踪处理。

3.我不想我的网站被Baiduspider访问,我该怎么做?

答:Baiduspider遵守互联网robots协议。您可以利用robots.txt文件完全禁止Baiduspider访问您的网站,或者禁止Baiduspider访问您网站上的部分文件。 注意:禁止Baiduspider访问您的网站,将使您的网站上的网页,在百度搜索引擎以及所有百度提供搜索引擎服务的搜索引擎中无法被搜索到。

ps:关于robots.txt的写作方法,请参看我们的介绍:robots.txt写作方法

4.为什么我的网站已经加了robots.txt,还能在百度搜索出来?

答:因为搜索引擎索引数据库的更新需要时间。虽然Baiduspider已经停止访问您网站上的网页,但百度搜索引擎数据库中已经建立的网页索引信息,可能需要二至四周才会清除。 另外也请检查您的robots配置是否正确。

5.我希望我的网站内容被百度索引但不被保存快照,我该怎么做?

答:Baiduspider遵守互联网meta robots协议。您可以利用网页meta的设置,使百度显示只对该网页建索引,但并不在搜索结果中显示该网页的快照。

和robots的更新一样,因为搜索引擎索引数据库的更新需要时间,所以虽然您已经在网页中通过meta禁止了百度在搜索结果中显示该网页的快照,但百度搜索引擎数据库中如果已经建立了网页索引信息,可能需要二至四周才会在线上生效。

6.百度蜘蛛在robots.txt中的名字是什么?

答:“Baiduspider” 首字母B大写,其余为小写。

7.Baiduspider多长时间之后会重新抓取我的网页?

答:百度搜索引擎每周更新,网页视重要性有不同的更新率,频率在几天至一月之间,Baiduspider会重新访问和更新一个网页。

8.Baiduspider抓取造成的带宽堵塞?

答:Baiduspider的正常抓取并不会造成您网站的带宽堵塞,造成此现象可能是由于有人冒充baidu的spider恶意抓取。如果您发现有名为Baiduspider的agent抓取并且造成带宽堵塞,请尽快和我们联系。您可以将信息反馈至[email protected],如果能够提供您网站该时段的访问日志将更加有利于我们的分析。

档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长进,更重要的是通过和能人交流,以更高的眼界更宏观的看待数据、应用以及问题,这就是成长)。 我之前采用的方式,可以满足需求,但是POI数据获取效率差一些(虽然已经很快,但是相比本文这种还是慢一些)、数据现势性不好,高德数据和百度数据虽然是两套,但是仅仅是坐标不同(所以显然还是一套)。所以,我加一种方式来爬取百度poi。

一 调研: 百度API提供了一个叫Place API获取poi的接口,有个城市内检索 实例为

ce/v2/search?query=银行&page_size=10&page_num=0&scope=1&region=北京&output=json&ak={您的密钥}

它返回的是个json类型数据,一个区域最大返回数为400,每页最大返回数为20。显然一个城市内不管什么类别的poi,不可能只有400个,会遗漏数据,故舍去

还有一个矩形区域检索,实例为

u.com/place/v2/search?query=美食&page_size=10&page_num=0&scope=1&bounds=39.915,116.404,39.975,116.414&output=json&ak={您的密钥}只要区域划分得当,这个可以使用

二 要解决的问题

1 区域划分

网上有人通过递归写代码的方式来划分,这样划分有问题,第一,划分的区域不能完全对应一个城市的市区;第二,算法设计比较麻烦。解决办法,后面详细说。

2 类别问题

百度API的接口必须要指定query的类别,那么如果类别指定不准,或者类别不全,根本无法完成爬取一个城市所有poi的任务。解决办法,说实话,这个问题在我做这件事情的时候,

十分棘手,不过我最终找到了这个网页

/index.php?title=lbscloud/poitags,一切都不是问题了

三 整体流程

1 区域划分,2km*2km的区域基本可以满足需求,获取每个区域的对角坐标(经纬度),逐行写入一个txt文本里

2 爬虫程序编写 读取1中的txt文本,逐行循环;调用百度API接口,爬取json;将爬取的数据存入数据库中; 每个类别跑一次程序

3 爬下的POI数据处理 poi显示,投影坐标转换,与地图叠加

后文将详细介绍流程


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6426706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-22
下一篇 2023-03-22

发表评论

登录后才能评论

评论列表(0条)

保存