Spider
Posted py321
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spider相关的知识,希望对你有一定的参考价值。
1、解析模块
1、数据的分类
1、结构化数据
特点 :有固定的格式,如 :html、XML、JSON
2、非结构化数据
示例 :图片、音频、视频,这类数据一般都以二进制方式存储
2、正则表达式 re
1、使用流程
1、创建编译对象 :p = re.compile("正则表达式")
2、对字符串进行匹配 :r = p.match("字符串")
3、获取匹配结果 :print(r.group())
2、常用方法
1、match(html) :字符串开头的第1个,返回对象
2、search(html):从开始往后找,匹配第1个,返回对象
3、findall(html):所有全部匹配,返回一个列表
4、group() :从match或search返回对象中取值
3、表达式
. :匹配任意字符(不包括
)
d:数字
s:空白字符
S:非空白字符
w:字母、数字、(下划线)_
[...]:包含[]内容 :A[BCD]E --> ABE ACE ADE
* 0次或多次
? 0次或1次
+ 1次或多次
{m} m次
{m,n} m-n次 AB{1,3}C --> ABC ABBC ABBBC
4、贪婪匹配与非贪婪匹配
贪婪匹配(.*) :在整个表达式匹配成功的前提下,尽可能多的匹配*
非贪婪匹配(.*?) :在整个表达式匹配成功的前提下,尽可能少的匹配*
5、findall()的分组
import re
#解释 :先按照整体匹配出来,然后再匹配()中的
# 如果有2个或者多个(),则以元组的方式取显示
s = "A B C D"
p1 = re.compile(‘w+s+w+‘)
print(p1.findall(s))
# [‘A B‘,‘C D‘]
p2 = re.compile(‘(w+)s+w+‘)
# 第1步 :[‘A B‘,‘C D‘]
# 第2步 :[‘A‘,‘C‘]
print(p2.findall(s))
p3 = re.compile(‘(w+)s+(w+)‘)
# 第1步 :[‘A B‘,‘C D‘]
# 第2步 :[(‘A‘,‘B‘),(‘C‘,‘D‘)]
print(p3.findall(s))
6、练习
<div class="animal">
<p class="name">
<a title="tiger"></a>
</p>
<p class="contents">
Two tigers two tigers run fast
</p>
</div>
<div class="animal">
<p class="name">
<a title="rabbit"></a>
</p>
<p class="contents">
Small white rabbit white and white
</p>
</div>
第一步:
[(‘tiger‘, ‘Two tigers two tigers run fast‘), (‘rabbit‘, ‘Small white rabbit white and white‘)]
第二步:
动物名称:tiger
动物描述:Two tiger ...
正则:p = re.compile(‘<div class="animal".*?title="(.*?)">.*?contents">(.*?)</p>‘,re.S)
3、案例1:内涵段子脑筋急转弯抓取
网址 :www.neihan8.com
步骤:
1、找URL规律
第1页:https://www.neihan8.com/njjzw/index.html
第2页:https://www.neihan8.com/njjzw/index_2.html
第3页:https://www.neihan8.com/njjzw/index_3.html
2、用正则匹配出 题目 和 答案
p = re.compile(‘<div class="text-.*?title="(.*?)".*?<div class="desc">(.*?)</div>‘,re.S)
3、写代码
1、发请求
2、用正则匹配
<div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>
3、写入本地文件
见 :04_内涵8脑筋急转弯抓取.py
4、猫眼电影top100榜单,存到csv表格文件里
网址:猫眼电影 - 榜单 - top100榜
目标:抓取电影名、主演、上映时间
1、知识点讲解
1、csv模块的使用流程
1、打开csv文件
with open("测试.csv","a",newline="") as f:
2、初始化写入对象
writer = csv.writer(f)
3、写入数据(列表)
writer.writerow([列表])
2、见 :06_猫眼电影top100.py
2、准备工作
1、找URL
第1页:http://maoyan.com/board/4?offset=0
第2页:http://maoyan.com/board/4?offset=10
第n页:offset = (n-1)*10
2、正则匹配
<div class="movie-item-info">.*?title="(.*?)".*?class=="star">(.*?)</p>.*?class="releasetime">(.*?)</p>
3、写代码
2、数据持久化存储
1、存入mongodb数据库(pymongo模块回顾)
import pymongo
# 创建连接对象
conn = pymongo.MongoClient("localhost",27017)
# 创建数据库对象
db = conn.库名
# 创建集合对象
myset = db.集合名
# 插入数据
myset.insert(字典)
>>>mongo
>>>show dbs
>>>use 库名
>>>show collections
>>>db.集合名.find().pretty()
>>>db.dropDatabase()
>>>db.集合名.count()
2、存入mysql数据库(pymysql模块回顾)
3、requests模块
1、安装(用管理员身份去打开Anaconda Prompt)
Anaconda : conda install requests
Windows cmd: python -m pip install requests
## python -m是以管理员身份去执行pip安装命令
Ubuntu :sudo pip3 install requests
2、常用方法
1、requests.get(url,headers=headers)
发起请求,获取响应对象
2、响应对象的response属性
1、res.text :返回字符串类型
2、res.content: 返回bytes类型
应用场景 :爬取非结构化数据
3、res.encoding:指定字符编码(一般为ISO-8859-1)
response.encoding = "utf-8"
4、res.status_code:返回服务器响应码
5、res.url : 返回实际数据的URL地址
3、get()使用场景
1、没有查询参数
res = requests.get(url,headers=headers)
2、有查询参数(params={})
res = requests.get(url,params=params,headers=headers)
注 :params参数必须为字典,自动进行编码
4、post() 参数名 :data
1、data = {}
2、示例 :10_有道翻译post.py
以上是关于Spider的主要内容,如果未能解决你的问题,请参考以下文章