NLP 获取相似词 - 1.爬取百度搜索结果

7 篇文章 0 订阅

视频链接:https://www.bilibili.com/video/av78674056

一,前言

NLP实际项目要用到,给定一个词,找出它的同义词、相似词、拓展词等。

我思考了下,有:

1,同义词表
2,word2vec同义词

等方法。

1肯定可行,但效果不一定好,现有资源为 哈工大同义词表;2方法之后试一下,一个是性能和速度,在windows下能否有效执行,另一个是到底有没有相似词,如果我要找“氨基酸”的相似词,恐怕word2vec词向量里面没有多少这种专有名词吧。

但,我想到了一个绝佳的骚操作,并且可行,

那就是用百度搜索作为接口,搜索后不是有显示相关词吗?这就是我们想要的,要知道,这可是百度这么大一个公司算法团队专门优化出来的结果,效果自然杠杠的。咱们借用一下,嘿嘿。

 

二、失败爬虫

本来以为爬虫挺简单的,但却因为网上教程大多过时,失效,故花了一上午,遂记录。

我了解到的,一般来说,爬虫有:

1,python库类型的, urlib,requests等。 采用。

2,Scrapy爬虫框架。 专门用来抓取大量数据的,不用。

3,Selenium模拟浏览器爬虫。  优点是可以有效反爬,缺点性能不高,不用。

 

不安装任何第三方库,用urlib

# -*- coding:utf-8 -*-

import urllib.request

#设置头
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'
}

#编码关键词
data1 = {
    'wd':'氨基酸'
}
data1_encode = urllib.parse.urlencode(data1)
url = 'https://www.baidu.com/s?'+data1_encode

#这样也是可以的
#word = '氨基酸'
#url = 'https://www.baidu.com.cn/s?wd=' + urllib.parse.quote(word) + '&pn=0' # word为关键词,pn是百度用来分页的..

request = urllib.request.Request(url, headers=headers)
my_file = urllib.request.urlopen(request)
data = my_file.read()

with open("test.html","wb") as f:
    f.write(data)
print("finish")

结果:

担心是访问https的原因,加上:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

还是没用。

 

三、成功爬虫

python3环境

实验发现,headers内容不够,加上多一点信息,则正确。

修改headers为:

#设置头
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, compress',
    'Accept-Language': 'en-us;q=0.5,en;q=0.3',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'
} #定义头文件,伪装成浏览器

但得到的结果,确是乱码!如图:

需要一系列的解码操作才行,因此,

正确代码如下:(这种不许额外安装库,python3自带urlib)

# -*- coding:utf-8 -*-
import urllib.request

#设置头
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, compress',
    'Accept-Language': 'en-us;q=0.5,en;q=0.3',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'
} #定义头文件,伪装成浏览器

#编码关键词
word = '氨基酸'
url = 'https://www.baidu.com.cn/s?wd=' + urllib.parse.quote(word) + '&pn=0' # word为关键词,pn是百度用来分页的..

request = urllib.request.Request(url, headers=headers)
my_file = urllib.request.urlopen(request)
data = my_file.read()

#解码操作
from io import BytesIO
import gzip
buff = BytesIO(data)
f = gzip.GzipFile(fileobj=buff)
res = f.read().decode('utf-8')

#写到文件的方式和下面不同
with open("test1.html","w",encoding="utf-8") as f:
    f.write(res)
print("finish")

正确结果如:

 

方法二:(安装requests库,自动解码,方便)

# -*- coding:utf-8 -*-
import requests
import urllib.request

#设置头
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, compress',
    'Accept-Language': 'en-us;q=0.5,en;q=0.3',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'
} #定义头文件,伪装成浏览器

#编码关键词
data1 = {
    'wd':'氨基酸'
}
data1_encode = urllib.parse.urlencode(data1)
url = 'https://www.baidu.com/s?'+data1_encode

#这样也是可以的
#word = '氨基酸'
#url = 'https://www.baidu.com.cn/s?wd=' + urllib.parse.quote(word) + '&pn=0' # word为关键词,pn是百度用来分页的..

x = requests.get(url,headers=headers)
data = x.content

with open("test2.html","wb") as f:
    f.write(data)
print("finish")

成功!

截止2019.12.9正确,当前网上的此类教程大多数都是失效的。

 

下一步,用各种方法,提取相似词汇,见下一篇博客。

NLP 获取相似词 - 2.提取相似词  https://blog.csdn.net/GreatXiang888/article/details/103457697

 

参考资料:

python3爬取百度搜索结果url,获得真实url,提取网页正文并分词,多进程的使用

https://blog.csdn.net/u012249992/article/details/79525396

爬虫获取网页数据,报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start by

https://blog.csdn.net/hj_xy_0705/article/details/85011072

urllib.parse的quote和urlencode区别  https://blog.csdn.net/laughing_l/article/details/78094073

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值