scrapy实战1,基础知识回顾和虚拟环境准备

 

 
 
视频地址
 
一. 基础知识回顾
 
 
1. 正则表达式
1)贪婪匹配,非贪婪匹配
.*?        非贪婪
.*         贪婪模式

 

2)中括号的三种用法:
1[34578][0-9]{9}   使用"-"表示区间,写多个值表示取任一个值
[^1]          不是1的任意值
[.*]           中括号的值没有特殊含义

 

3)[\u4E00-\U9FA5]   这个是unicode编码,表示任意汉字
 
4)\w,\d,"|" 以及\s
\w          表示任意字母数字下划线,等价于[a-zA-Z0-9_]
\d         表示任意数字
"|"         表示这个符号两边的数值都可,相当于或
\s          表示任意空白字符
             
 
\S, \D, \W取反
 
 
 
 
 
2. 深度优先和广度优先
 
 
深度优先访问顺序: ABDEICFGH  (递归实现)
广度优先访问顺序:ABCDEFGHI (队列实现)
 
深度优先实现过程
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:
            retrun depth_tree(tree_node._right)

 

 
广度优先实现过程
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)

 

 
 
3. 爬虫去重策略
1). 将访问过的url保存到数据库,效率低
2). 保存到内存中,比如set,只需要o(1)的代价即可,但是占用内存会越来越高
一亿条URL*2byte*50个字符/1024/1024/1024=9G
3). url经过md5等方法缩减后保存到set中,减少了内存占用,一亿URL只须2-3G, scrapy使用的是这样方法
4). 用bitmap方法,将访问过的url通过hash函数映射到某一位(bit),会有冲突
5). bloomfilter方法对bitmap改进,多重hash函数降低冲突, 一亿的url只须15M左右
 
 
 
4. 字符串编码
1)计算中8个bit作为一个字节,一个字节能表示的最大数字是255,英文比较简单,所以一个字节就能表示所有的字符了,所以有了ASCII(一个字节)是美国人的标准编码
2)但是中文不止255个汉字,所有中国制定了GB2312编码,用两个字节表示一个汉字;同理日文,韩文等也制定了自己的编码规则。
3)如果出现多种语言的混合显示就会出现乱码,所以出现了unicode,将所有语言统一到一套编码中。
4)unicode是用2个字节表示的,如果用unicode编码来表示ASCII编码内容,需要在原基础前面添加8位0,多占用了一倍的空间
5)utf-8:可变长编码,它把英文变为一个字节长度,汉字为3个字节,特别生僻的变成4-6个字节。如果传输大量的英文,utf8的作用就很明显了
6)在编程的时候,内存处理中使用unicode编码来处理会比较简单,因为统一占用2个字节的内容
7)python3中,字符编码格式默认为unicode,若想编码为utf-8,如下
s="我用python"
s.encode("utf-8")
 
 
 
 
 
二. 虚拟环境准备
1. window下创建虚拟环境
 
1)进入cmd执行如下命令
pip install virtualenv
pip install virtualenvwrapper-win
 
创建虚拟环境并启动
首先在E盘创建一个virtualenv文件夹,并设置环境变量如下
 
2)退出cmd,重新进入执行如下命令
mkvirtualenv spider,即可创建一个位于E:\virtualenv,名字为spider的虚拟环境
   
 
3)安装scrapy并创建项目
在spider虚拟环境中执行:pip install -i https://pypi.douban.com/simple scrapy
退出虚拟环境,然后在D盘创建目录workshop用来存放项目
cd workshop
workon spider   #进入虚拟环境
scrapy startproject Article
 
4)开启pycharm,找到d:workshop导入项目Article
在setting中设置python解释器为d:\virtualenv下的python.exe
 
在cmd中执行如下命令,不能在pycharm的Terminal中执行
cd Article
scrapy genspider jobbole blog.jobbole.com
 
 
注意:
1. 如果安装有多个版本的python,比如想创建python2的虚拟环境,执行如下命令
virtualenv -p 安装路径/python.exe scrapytest
 
2. 创建项目的时候可能会出现下面错误
1) visual c++ 14 is required
 
2)UserWarning: You do not have a working installation of the service_identity module: 'cannot import name 'opentype''.
解决方法:
pip install -i https://pypi.douban.com/simple/ service_identity --force --upgrade
 
 
 
 
2. 创建调试功能
 
2.1 在scrapy.cfg的同级目录下创建main.py文件
from scrapy.cmdline import execute
import sys
import os
 
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy", "crawl", "jobbole"])
注意:
1)其中execute中的3个列表元素就是下面cmd命令中scrapy crawl jobbole的字符
2)os.path.abspath(__file__)表示main.py文件,前面加上os.path.dirname()表示main.py的父级目录,也就是当前项目所在目录
 
在cmd中执行scrapy crawl jobbole,可能会出现一下错误
ImportError: No module named 'win32api'
解决方法:pip install -i https://pypi.douban.com/simple  pypiwin32
 
 
 
2.2 在setting->appearance->keymap选择keymaps为Eclipse
 
 
 
2.3 在spiders/jobbole.py中添加断点如下,然后debug main.py启动,F6, F8进行调试
 
 
 
 
posted @ 2018-09-11 17:40  坚强的小蚂蚁  阅读(378)  评论(0编辑  收藏  举报