视频链接: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