Spider_reg
解析
数据的分类
- 结构化数据
- 有固定的格式,如 :HTML、XML、JSON
- 非结构化数据
- 图片、音频、视频,这类数据一般都存储为二进制
正则表达式 re
使用流程
- 创建编译对象:p = re.compile("正则表达式")
- 对字符串匹配:r = p.match("字符串")
- 获取匹配结果:print(r.group())
常用方法
- match(s) :字符串开头的第1个,返回对象
- search(s):从开始往后找,匹配第1个,返回对象
- group() :从match或search返回对象中取值
- findall():所有全部匹配,返回一个列表
表达式
- . 匹配任意字符(不能匹配\n)
- \d 数字
- \s 空白字符
- \S 非空白字符
- [...] 包含[]内容 :A[BCD]E --> ABE ACE ADE
- \w 字母、数字、_- * 0次或多次
- ? 0次或1次
- + 1次或多次
- {m} m次
- {m,n} m-n次 AB{1,3}C --> ABC ABBC ABBBC - 贪婪匹配(.*) :在整个表达式匹配成功的前提下,尽可能多的匹配*
- 非贪婪匹配(.*?) :在整个表达式匹配成功的前提下,尽可能少的匹配* - 分组
# 贪婪匹配和非贪婪匹配
import re
s = """<div><p>春眠不觉晓,处处闻啼鸟</div></p>
<div><p>举头望明月,低头思故乡</div></p>"""
# 创建编译对象
p = re.compile('<div><p>.*</div></p>', re.S) # re.S:使.能够匹配\n在内的所有字符,相当于在中间/s/S
p2 = re.compile('<div><p>.*?</div></p>', re.S)
# 匹配字符串s
r = p.findall(s)
r2 = p2.findall(s)
print("贪婪匹配:", r)
print("非贪婪匹配:", r2)
贪婪匹配: ['<div><p>春眠不觉晓,处处闻啼鸟</div></p>\n<div><p>举头望明月,低头思故乡</div></p>']
非贪婪匹配: ['<div><p>春眠不觉晓,处处闻啼鸟</div></p>', '<div><p>举头望明月,低头思故乡</div></p>']
# findall()分组示例
# 解释:先按照整体匹配出来,然后再匹配()中的,如果有两个或者多个括号,则以元祖的方式显示
import re
s = "A B C D"
p1 = re.compile("\w+\s+\w+")
print(p1.findall(s))
p2 = re.compile("(\w+)\s+\w+")
# 第一步:['A B', 'C D']
# 第二步:在A B,C D中匹配括号中的内容
print(p2.findall(s))
p3 = re.compile("(\w+)\s+(\w+)")
print(p3.findall(s))
['A B', 'C D']
['A', 'C']
[('A', 'B'), ('C', 'D')]
# 练习
# 打印:
# [("Tiger", "Two tiger..."), ("Rabbit", "Small Ra...")]
# 动物名称:Tiger
# 动物描述:....
import re
s = """\
<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>
"""
p = re.compile(r'<div class.*?title="(.*?)">.*?contents">(.*?)</p>', re.S)
r = p.findall(s)
print(r)
for animal in r:
print("动物名称:", animal[0].strip())
print("动物描述:", animal[1].strip())
[('Tiger', '\n Two tigers two tigers run fast\n '), ('Rabbit', '\n Small white rabbit white and white \n ')]
动物名称: Tiger
动物描述: Two tigers two tigers run fast
动物名称: Rabbit
动物描述: Small white rabbit white and white
案例1:内涵段子脑筋急转弯抓取
- 网址 :www.neihan8.com
- 步骤:
- 找URL规律
- 用正则匹配题目、内容
p = re.compile('<h4> <a href=.*?<b>(.*?)</b>.*?f18 mb20">(.*?)</div>', re.S)
- 写代码
- 发请求
- 用正则匹配
- 写入本地文件
import urllib.request
import urllib.parse
import re
class NeiHanSpider:
def __init__(self):
self.baseurl = "https://www.neihanba.com/dz/"
self.headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
self.page = 1
# 下载页面
def load_page(self, url):
req = urllib.request.Request(url, headers=self.headers)
res = urllib.request.urlopen(req)
html = res.read().decode("gbk")
self.parse_page(html)
# 解析页面
def parse_page(self, html):
p = re.compile('<h4> <a href=.*?<b>(.*?)</b>.*?f18 mb20">(.*?)</div>', re.S)
r_list = p.findall(html)
self.write_page(r_list)
# 保存页面
def write_page(self, r_list):
for r_tuple in r_list:
with open("dz.txt", "a") as f:
f.write('\n' + r_tuple[0].strip() + '\n' + r_tuple[1].strip() + '\n')
def main(self):
self.load_page(self.baseurl)
while True:
c = input("是否继续(y/n)?")
if c.strip().lower() == 'y':
self.page += 1
url = self.baseurl + "list_" + str(self.page) + ".html"
self.load_page(url)
else:
print("爬取结束,谢谢使用!")
break
if __name__ == "__main__":
spider = NeiHanSpider()
spider.main()
案例2:猫眼电影top100榜单,存到csv表格文件中
- 网址:猫眼电影 - 榜单 - top100榜
- 目标:抓取电影名、主演、上映时间
- 知识点讲解
- csv模块的使用流程
- 打开csv文件
with open("测试.csv","a") as f:
- 初始化写入对象
writer = csv.writer(f)
- 写入数据
writer.writerow(列表)
- 打开csv文件
- 示例 见05_csv示例.py
- 找URL
- 第1页:http://maoyan.com/board/4?offset=0
- 第2页:http://maoyan.com/board/4?offset=10
- 第n页:offset = (n-1)*10
- 正则匹配
<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>
- 写代码
- 找URL
- csv模块的使用流程
import urllib.request
import urllib.parse
import re
import csv
class MaoYanSpider:
def __init__(self):
self.baseurl = 'http://maoyan.com/board/4?offset='
self.headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
self.page = 1
self.offset = 0
# 下载页面
def load_page(self, url):
req = urllib.request.Request(url, headers=self.headers)
res = urllib.request.urlopen(req)
html = res.read().decode()
self.parse_page(html)
# 解析页面
def parse_page(self, html):
# p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>', re.S)
p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?主演:(.*?)</p>.*?releasetime">(.*?)</p>', re.S)
r_list = p.findall(html)
self.write_page(r_list)
# 保存页面
def write_page(self, r_list):
for r_tuple in r_list:
with open("top.csv", "a", newline='') as f: # 开头不空行
# 创建写入对象
writer = csv.writer(f)
L = [i.strip() for i in r_tuple]
# ["霸王别姬","张国荣","1994..."]
writer.writerow(L)
def main(self):
self.load_page(self.baseurl)
while True:
c = input("是否继续(y/n)?")
if c.strip().lower() == 'y':
self.page += 1
self.offset = (self.page - 1) * 10
url = self.baseurl + str(self.offset)
self.load_page(url)
else:
print("爬取结束,谢谢使用!")
break
if __name__ == "__main__":
spider = MaoYanSpider()
spider.main()
Fiddler常用菜单
- Inspector:查看抓到的数据包的详细内容
- 分为请求(request)和响应(response)两部分
- 常用选项
- Headers:显示客户端发送到服务器的header,包含客户端信息、cookie、传输状态
- WebForms:显示请求的POST数据
- Raw:将整个请求显示为纯文本
- 请求方式及案例
- GET
- POST
- Cookie模拟登陆
什么是cookie、session
- HTTP是一种无连接协议,客户端和服务器交互仅仅限于请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。
- cookie:通过在客户端记录的信息确定用户身份
- session:通过在服务端记录的信息确定用户身份
案例3:使用cookie模拟登陆cnblogs
1. 通过抓包工具、F12获取到cookie(先登陆1次网站)
2. 正常发请求
url:https://home.cnblogs.com/u/haoenwei/
Spider_reg的更多相关文章
随机推荐
- Html+CSS基础之CSS样式
认识CSS样式 CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. 如下列代码: p{ fo ...
- BZOJ 1579 道路升级 Dijkstra
思路: 这道题 不能把所有边都建出来 会MLE的!!! oh gosh 其实不建所有的边 用的时候再调就行了-.(也没啥区别) //By SiriusRen #include <queue> ...
- 外连接OUTER JOIN(三十五)
外连接OUTER JOIN LEFT [OUTER] JOIN,左外连接 显示左表的全部记录及右表符合连接条件的记录 下面我们来演示一下,操作命令及部分结果如下: SELECT goods_id, ...
- Linux下搭建iSCSI共享存储详细步骤(服务器模拟IPSAN存储)
一.简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够 ...
- XT800 在域环境在运行设置
测试时先将防火墙关了,不然无法远程,找个问题后再打开防火墙 0. 防火墙中建立规则,允许XT800通过. 1.在客户端当前用户下运行XT800安装程序 2.输入管理员账号及密码 3.安装时选择D或E盘 ...
- ThinkPad X260 UEFI安装 win7 64位 方法
ThinkPad X260 UEFI安装 win7 64位 方法 1.使用DG重新格式化硬盘,格式为GPT 2.使用CGI 安装 WIM文件 (image不知是否可以,下次测试) 3.改BIOS ...
- python爬虫批量抓取ip代理
使用爬虫抓取数据时,经常要用到多个ip代理,防止单个ip访问太过频繁被封禁.ip代理可以从这个网站获取:http://www.xicidaili.com/nn/.因此写一个python程序来获取ip代 ...
- WP8 学习笔记(001_环境配置)
Step 1 WP8 的开发要求64位操作系统,Windows 8及以上版本,需要激活版,建议网上买一个注册码.详见安装双系统. Step 2 安装好系统并已经激活之后,需要安装Windows Ph ...
- 【Henu ACM Round#17 D】Hexagons!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目的图吓人. 找下规律就会发现从内到外是1,6,12,18 即1,16,26,36... 即1+6(1+2+3+...) 等差求和 ...
- Intellij IDEA使用指南(持续更新)(转)
一.项目层面 1.Java开发工具IntelliJ IDEA导入项目 http://jingyan.baidu.com/article/a17d52852118ac8098c8f2c1.html 2. ...