python爬虫笔记

下载包到本地安装

1. 包地址 https://www.lfd.uci.edu/~gohlke/pythonlibs/

2. 找到对应包, 下载到本地

3. cmd 进入包所在文件夹, pip3 install xxx 完成安装


2-4 pycharm的安装和配置

安装虚拟环境。这种是把虚拟环境装在目录下。


2-5 pycharm快捷键 (Eclipse Mac OS x)

ctrl + 左键点击查看引用
Command + otption+ 右箭头返回查看引用
option + 向上箭头,向下箭头整行代码的上下移动
command + d删除整行代码
ctrl + h全局搜索
command + k文件内搜索
tab退4格
shift + tab回退(向前4格)
command + 左键定位到行首
command + 右键定位到行尾
ctrl + o显示大岗
command + shift + r快速搜索
command + shift + f格式化代码

2-9 虚拟环境 virtualenv的安装

mac下配置

1. 安装 virtualenv pip install virtualenv

2. 安装虚拟环境管理器 pip install virtualenvwrapper

3. 完成后,vim ~/.bash_profile

4. 在里面输入

export WORKON_HOME='~/.envs'

export VIRTUALENVWRAPPER_PYTHON='/usr/local/bin/python3'

source /usr/local/bin/virtualenvwrapper.sh

5. WORKON_HOME 是虚拟环境所存在的目录,用点开头,mkdir .envs自己先建立好,这里必须以 .开头

6. VIRTUALENVWRAPPER_PYTHON 是默认的python3,可以用 sudo find / -name python3 来查找python3的路径

7. 可以用 sudo find / -name virtualenvwrapper.sh 来查询 位置 5,6,7是第四步的解释

8. 这3行写好之后,wq保存退出。

9. 运行 source ~/.bash_profile 先运行才可以操作.

10. 创建一个虚拟环境 mkvirtualenv -p /usr/local/bin/python3 env1 (mkvirtualenv env1) 上面设置了默认为 python3,但是测试的时候不行。

11. 介绍

1. 列出虚拟环境:lsvirtualenv -b

2. 切换虚拟环境:workon env1

3. 退出虚拟环境:deactivate

4. 删除虚拟环境:rmvirtualenv test2


6-2 request介绍

参考: Python - requests库 学习笔记(持续更新) - 知乎

  1. get方式   
  2. post方式  
import json

import requests

## 1、get 请求
res = requests.get('http://www.baidu.com')
# 编码
print(res.encoding)
# 文本
print(res.text)

## 2、post 请求
payload = dict(key1='value1', key2='value2')
res = requests.post('http://192.168.0.77:20021/admin/order/refund/index', data=payload)
# 编码
print(res.encoding)
# json 结果
print(res.json())
# 状态码
print(res.status_code)

## 3、设置 header 头
my_headers = {
    'user-agent': 'requests',
    'imooc_uid': '321',
    'authorization': '53270679ec4193939e04ca4d13e3dac3'
}
res = requests.post('http://192.168.0.77:20021/admin/order/refund/index', headers=my_headers, data=payload)
# json 结果
print(res.json())
# 打印 response的headers
print(res.headers)

## 4、参数 json 化 , 这样服务器端接受到的是 json 数据
res = requests.post('http://192.168.0.77:20021/admin/order/refund/index', headers=my_headers, data=json.dumps(payload))

6-3 正则表达式

.匹配任意字符(不包含换行符)
^匹配开始位置,多行模式下匹配每一行的开始
$匹配结束位置,多行模式下匹配每一行的结束
*匹配前一个元字符 0到多次
+匹配前一个元字符 1到多次
匹配前一个元字符 0到1次
{m,n}匹配前一个元字符 m到n次
\\转移字符
[]字符集,一个字符的集合,可匹配其中任意一个字符
|逻辑表达式 或,比如 a|b 代表可匹配 a 或者 b
\b匹配位于单词开始或结束位置的空字符串
\B匹配不位于单词开始或结束位置的空字符串
\d匹配一个数字,相当于 [0-9]
\D匹配非数字,相当于 [^0-9]
\s匹配任意空白字符,相当于 [ \t\n\r\f\v]
\S匹配非空白字符,相当于 [^ \t\n\r\f\v]
\w匹配数字、字母、下划线中任意一个字符,相当于 [a-zA-Z0-9]
\W匹配非数字、字母、下划线中的任意字符,相当于[^a-zA-Z0-9]

1.查找 findall 找到所有数据

import re

info = "姓名:bobby 生日:1987年10月11日 本科:2005年9月1日"

# 查找
print(re.findall('\d{4}', info))

2. re.match()  re.search() 查找  re.compile() 匹配

    re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')   

    re.match() 是从最开始的时候匹配的

    re.search() 是全文匹配,不用在前面加  .*

import re

info = "姓名:bobby1987 生日:1987年10月11日 本科:2005年9月1日"

# 查找
# print(re.findall('\d{4}', info))
print(re.match(".*生日.*\d{4}", info))
print(re.search("生日.*\d{4}", info))
# match方法是从字符串最开始匹配的
# search 方式不是从最开始的地方匹配,所以不用在最前面加 .*

结果用 group() 来获取

match_result = re.match(".*生日.*?(\d{4})", info)
print(match_result.group())
print(match_result.group(0))
print(match_result.group(1)) 

3. re.sub() 替换字符串

info = "姓名:bobby1987 生日:1987年10月11日 本科:2005年9月1日"

# 替换
sub_result = re.sub('\d{4}', '2019', info)
print(sub_result)  #姓名:bobby2019 生日:2019年10月11日 本科:2019年9月1日

4. 匹配模式

 re.IGNORECASE 忽略大小写

re.DOTALL 不会因为换行符而停止匹配,有换行也会一直匹配

# 匹配模式 
name = "my name is Bobby"
print(re.search("bobby", name, re.IGNORECASE).group())

 6-5 beautifulsoup 用法

安装 pip install beautifulsoup4  

查询元素几种方式

from bs4 import BeautifulSoup

bs = BeautifulSoup(html, "html.parser")
  1. bs.title.string 获取title标签下的字符串
  2. bs.find()         找到满足条件的第一个结果
  3. bs.find_all()   找到所有满足条件的结果
find() 5种用法
div_tag = bs.find('div')
div_tag = bs.find(id="info")
div_tag = bs.find('div', id="info")
div_tag = bs.find('div', id=re.compile("post-\d+")) 通过正则
div_tag = bs.find(string="hello")  通过内容定位元素
div_tag = bs.find(string=re.compile("post-\d+"))  通过内容正则定位元素

查找子元素

div_tag = bs.find(id="info")
childrens = div_tag.contents  获取一级子元素
for child in childrens:
    if child.name:
        print(child.name)
------------------------------
div_tag = bs.find(id="info")
childrens = div_tag.descendants  获取所有子元素
for child in childrens:
    if child.name:
        print(child.name)

获取父元素

div_tag = bs.find(id="info")
parent = bs.find("p", {"class", "name"}).parent  查找直接父元素
--------------------------------------------------
div_tag = bs.find(id="info")
parents = bs.find("p", {"class", "name"}).parents  查找所有父元素
for parent in parents:
    print parent.name

获取兄弟节点

div_tag = bs.find(id="info")
next_siblings = bs.find("p", {"class", "name"}).next_siblings 获取之后的兄弟节点
for sibling in next_siblings:
    print(sibling.name)

---------

div_tag = bs.find(id="info")
prev_siblings = bs.find("p", {"class", "name"}).prev_siblings 获取之前的兄弟节点
for sibling in prev_siblings:
    print(sibling.name)

获取div的属性

name_tag = bs.find("p", ['class', 'name'])
print(name_tag['class'])       第一种方法
print(name_tag.get('class'))   第二种方法,比较好,没有则为空,不会报错, 
上面返回的是一个 list

如果是一个自定义属性,返回的是一个 字符串,例如 <div xxx data-test="abc eft"></div>

name_tag = bs.find("p", ['class', 'name'])
print(name_tag['data-test'])       返回字符串 abc eft

6-7 xpath基本语法

插件下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/

1.安装 pip install lxml

2. 安装 pip install twisted

3. 按照 pip install scrapy

ps: mac上安装出现 无法安装的情况,有2种方法解决

1. xcode-select --install 先安装这个

2. 原生下载太慢了,用 豆瓣的镜像

pip install -i https://pypi.douban.com/simple twisted

pip install -i https://pypi.douban.com/simple scrapy

1. xpath 简介

    1.1 xpath使用路径表达式在xml和html中进行导航

    1.2 xpath包含标准函数库

    1.3 xpath是一个w3c的标准

2. xpath节点关系

    2.1 父节点

    2.2 子节点

    2.3 同胞节点

    2.4 先辈节点

    2.5 后代节点

3. xpath语法

//* 表示所有代码

[@id='info']  表示id=info的节点

/div 表示 id=info下面的div节点

/p[1] 表示 id=info 下面的div节点 下面的 第一个p节点

/text() 表示获取里面的 文字,输出为 str

.extract() 把结果转为 list类型

[0] 表示取list的第一个值

表达式说明
article选取所有 article 元素的所有子节点
/article选取根元素 article
article/a选取所有属于article的子元素的a元素
//div选取所有div子元素(不论出现在文档任何地方)
article//div选取所有属于 article 元素的后代的 div 元素,不管它出现在 article 之下的任何位置
//@class选取所有名为 class 的属性
/article/div[1]选取属于 article 子元素的第一个div元素
/article/div[last()]选取属于article子元素的最后一个div元素
/article/div[last()-1]选取属于article子元素的倒数第二个div元素
//div[@lang]选取所有拥有lang属性的div元素
//div[@lang="eng"]选取所有lang属性为eng的div元素
/div/*选取属于div元素的所有子节点
//*选取所有元素
//div[@*]选取所有带属性的div元素
//div/a | //div/p选取所有 div元素的a和p元素
//span | //ul选取文档中的 span和ul元素
article/div/p | //span选取所有属于article元素的div元素的p元素 以及文档中所有的span元素

ps1: xpath 可以配置, 可以从数据库中提取,很灵活 

from scrapy import Selector

sel = Selector(text=html)
name_xpath = "//*[@id='info']/div/p[1]/text()"
tag = sel.xpath(name_xpath).extract()[0]

ps2: xpath 获取一个节点,同时有2个class的情况下,必须要写2个,或者用下面的写法

写一个获取不到
teacher_tag = sel.xpath("//div[@class='teacher_info']/p") 
写2个才可以获取
teacher_tag = sel.xpath("//div[@class='teacher_info info']/p") 
或者用如下方法
teacher_tag = sel.xpath("//div[contains(@class,'teacher_info)]/p") 

ps3: xpath 获取属性值 最后加 /@class

text_xpath ="//*[contains(@class, 'nav')]/ul/@class"

ps4: xpath方法

Functions - XPath | MDN

ps5: 同时获取2个节点 |

text_xpath ="//p[@class='age']|//p[@class='work_years']"

 css 用法

from scrapy import Selector
import requests

# 解析html内容
html = requests.get('https://www.lfd.uci.edu/~gohlke/pythonlibs/')

# 解析后内容
html = html.text

# css选择器
sel = Selector(text=html)
# 获取值
ret = sel.css('#sitemenu>li a::text')

# 打印
print(ret.extract()[0])

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值