Python分布式爬虫打造搜索引擎(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Python分布式爬⾍打造搜索引擎(⼀)
Python分布式爬⾍打造搜索引擎
⼀、虚拟机linux下安装并运⾏pycharm:
1. 下载pycharm软件包并解压,解压完成即算安装完成:
tar -zxvf pycharm-professional-5.0.4.tar.gz
注意:此次项⽬中⽤到的pycharm必须是professional版的
2. 进⼊pycharm⽬录的下bin⽬录,执⾏:
./pycharm.sh # 启动pycharm
即可启动pycharm
3. 将pycharm启动路径加到⽤户⽬录下的.bashrc⽂件中,打开.bashrc:
vim ~/.bashrc # .bashrc,是隐藏⽂件
设置pycharm.sh启动路径:
alias pycharm="bash /home/nan/Downloads/pycharm-2018.3.2/bin/pycharm.sh" # 此⾏代码添加到.bashrc⽂件中
注:.bashrc下做的配置,与win下的path⽬录作⽤⼀样,配置后,启动软件便不⽤跑到该⽬录的bin⽬录下执⾏可执⾏⽂件,⽽可以直接在当前⽬录下执⾏:pycharm.sh 启动软件
4. 路径配置好之后,退出编辑模式,需执⾏:
source ~/.bashrc # 更新配置⽂件
此时,在⽤户⽬录下直接执⾏:pycharm ,便能打开pycharm编辑器了。
5. 安装完专业版pycharm,在使⽤时是需要提供注册码的,我们可以选择⽤license server的⽅式进⾏注册。
直接在⽹上搜索pycharm license server ,找到对应的(如:
),在pycharm中license server⽅式下,填上,点击确定就可以了。
附:pycharm默认部分快捷键:
Ctrl + Q # 快速查看⽂档
Ctrl + F1 # 显⽰错误描述或警告信息
Ctrl + Alt + T # 选中
Ctrl + / # ⾏注释
Ctrl + Shift + / # 块注释
Ctrl + W # 选中增加的代码块
Ctrl + Shift + W # 回到之前状态
Ctrl + Shift + ]/[ # 选中代码块结束、开始
Ctrl + Alt + L # 代码格式化
Ctrl + Alt + I # ⾃动缩进
Tab / Shift + Tab # 缩进、不缩进当前⾏
Ctrl + D # 复制选定的区域或⾏
Ctrl + Y # 删除选定的⾏
Ctrl + Shift + U # 将选中的区域进⾏⼤⼩写切换
Ctrl + Delete # 删除到字符结束
Ctrl + Backspace # 删除到字符开始
Ctrl + Numpad+/- # 展开折叠代码块
Ctrl + R # 替换
Ctrl + Shift + F # 全局查找
Ctrl + Shift + R # 全局替换
Shift + F10 # 运⾏
Shift + F9 # 调试
Ctrl + Shift + F10 # 运⾏编辑器配置
Ctrl + Alt + R # 运⾏manage.py任务
F8 # 调试跳过
F7 # 进⼊调试
pycharm
参考:
关于linux下python双版本(python2、python3),默认使⽤时2.7版本,通过设置,可以将默认环境改成python3.6版本:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
改回python2版本:
sudo update-alternatives --config python
设置好Python默认版本为python3后,再使⽤Python默认就变成python3,但是这个时候,pip会出问题,可以重新装pip
sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall
win/linux下都需要安装requests
安装scrapy
1、技术选型
Scrapy VS requests+beautifulsoup
1. requests和bs都是库,Scrapy是框架。
2. scrapy框架可以加⼊requests和bs。
3. scrapy是基于twisted,性能(异步IO)是最⼤的优势。
4. scrapy⽅便扩展,提供了很多内置的功能。
5. scrapy内置的css和xpath selector⾮常⽅便,bs最⼤的缺点就是慢
2、爬⾍能做什么?
1. 搜索引擎----百度、google、垂直领域搜索引擎
2. 推荐引擎----今⽇头条、⼀点资讯
3. 机器学习的数据样本
4. 数据分析(如⾦融数据分析)、舆情分析。
3、正则表达式
1)特殊符号:
^ # 开头 '^b.*'----以b开头的任意字符
$ # 结尾 '^b.*3$'----以b开头,3结尾的任意字符
* # 任意长度(次数),≥0
# ⾮贪婪模式,⾮贪婪模式尽可能少的匹配所搜索的字符串 '.*?(b.*?b).*'----从左⾄右第⼀个b和的⼆个b之间的内容(包含b)
+ # ⼀次或多次
{2} # 指定出现次数2次
{2,} # 出现次数≥2次
{2,5} # 出现次数2≤x≤5
| # 或例如,“z|food”能匹配“z”或“food”(此处请谨慎)。
“[z|f]ood”则匹配“zood”或“food”。
[] # 中括号中任意⼀个符合即可, '[abc]ooby123'----只要开头符合[]中任意⼀个即可
[^] # 取反,只要不在[]的即可(特殊符号在中括号中都没有特殊含义,⽐如说到的:^,在中括号中不再表⽰从头匹配,⽽只是表⽰取反,即没有了在正则中的特殊含义) [a-Z] # 从⼩a到⼤Z '1[48357][0-9]{9}'----电话号码
. # 匹配任意字符
\s # 匹配不可见字符 \n \t '你\s好'----可以匹配‘你好’
\S # 匹配可见字符,即普通字符
\w # 匹配下划线在内的任何单词字符
\W # 和上⼀个相反
[\u4E00-\u9FA5] # 只能匹配汉字
() # 要取出的信息就⽤括号括起来
\d # 数字
2)匹配⽅式:
import re
line = "hello world!"
regex_str = "^h.*"
match_obj = re.match(regex_str,line) # 从第⼀个字符开始匹配,成功则返回数据
search_obj = re.search(regex_str,line) # 从头匹配,只要过程中有匹配上,就算成功并返回数据,不会再继续匹配后⾯的数据
findall = re.findall(regex_str,line) # 从头匹配,匹配多个,成功的数据都返回,数据类型看下⾯
print(match_obj) # <_sre.SRE_Match object; span=(0, 12), match='hello world!'>
print(search_obj) # <_sre.SRE_Match object; span=(0, 12), match='hello world!'>
print(findall) # ['hello world!']
print(match_obj.group(0)) # hello world!
print(search_obj.group(0)) #hello world! ,findall没有 group ⽅法
# group(0)返回匹配到的第⼀个数据,group(1)、group(2)等返回的是括号()中取出的数据
1. ⽹站的树结构
2. 深度优先算法和实现----递归
3. ⼴度优先算法和实现----队列
1)深度优先demo:
def depth_tree(tree_node):
if tree_node is not None:
print (tree_node._data)
if tree_node._left is not None:
return depth_tree(tree_node.left)
if tree_node._right is not None:
return depth_tree(tree_node,_right)
2)⼴度优先demo:
def level_queue(root):
#利⽤队列实现树的⼴度优先遍历
if root is None:
return
my_queue = []
node = root
my_queue.append(node)
while my_queue:
node = my_queue.pop(0)
print (node.elem)
if node.lchild is not None:
my_queue.append(node.lchild)
if node.rchild is not None:
my_queue.append(node.rchild)
scrapy去重使⽤的是第三种⽅法:分布式scrapy-redis主要讲解bloomfilter去重⽅法
ASCII和unicode编码:
(1)字母A⽤ASCII编码⼗进制65,⼆进制01000001
(2)汉字‘中’已超多ASCII编码的范围,⽤unicode编码是20013,⼆进制01001110 00101101
(3)A⽤unicode编码中只需要前⾯补0,⼆进制是 00000000 01000001
ASCII:⼀个字节 GB2312:两个字节表⽰⼀个汉字 unicode:两个字节 utf-8:可变长编码,英⽂1个字节,汉字三个字节python2 默认编码格式为ASCII,Python3 默认编码为utf-8,python2表⽰中⽂:u"中华"(Unicode编码)
不同编码之间的转换:
GB2312编码→decode("GB2312")成Unicode编码→ encode("utf-8")成utf-8编码,反过来也⼀样。