P1 【Python爬虫】爬虫学习简介与正则表达式re

本书深入浅出地介绍了Python爬虫开发,从基础的Python环境配置到正则表达式、文件操作,再到爬虫框架如requests和Scrapy的使用。强调了正则表达式在数据提取中的作用,详细讲解了“.*”与“.*?”的区别,以及在Python中如何应用。此外,书中还涵盖了反爬虫技术,包括行为检测、验证码、登录验证等,并探讨了自动化爬虫与法律问题。
摘要由CSDN通过智能技术生成

目录

◆ 前言

◆ 第一章 绪论

◆ 1.1 爬虫

◆ 1.2 爬虫可以做什么

◆ 1.3 爬虫开发技术

◆第二章 Python基础

◆ 2.1 Python的安装和运行

◆ 第三章 正则表达式与文件操作

◆ 3.1 正则表达式

◆ 3.1.1 正则表达式介绍

◆ 3.1.2 正则表达式在Python中应用

◆ 重点:“.*”和“.*? ”的区别:

 ◆ 3.2 Python文件操作


◆ 前言

>> 本书提供了练习网站,其地址为http://exercise.kingname.info/。

◆ 第一章 绪论

◆ 1.1 爬虫

存在即合理,为什么爬虫程序会有其存在的土壤呢?这是由于传统低效率的数据收集手段越来越不能满足当今日益增长的数据需求所导致的。 


◆ 1.2 爬虫可以做什么

>> 只要针对一个页面开发出了爬虫,那么这个爬虫也能爬取基于同一个模板生成的不同页面。这种爬虫称为定向爬虫,也是本书所要讲到的爬虫类型。

>> 正是由于现在的网站大量使用了模板来生成页面,所以爬虫才能够有用武之地。

>> 在过去,尽职调查一般通过调查目标公司的客户或者审计财务报表来实现。而有了爬虫以后,要做尽职调查就方便很多了。


◆ 1.3 爬虫开发技术

>> 困难在于目前大多数的爬虫书籍,还停留在工具的讲解上,只告诉读者怎么用工具,却不告诉读者在遇到各种情况时应该如何举一反三,通过思考,用学过的技艺来处理第一次遇到的问题

>> 而另一个层面是“术”的层面,遇到各种反爬虫问题时,应该如何突破,如何隐藏爬虫,如何模拟人的行为,以及遇到没有见过的反爬虫策略时,应该如何思考及如何使用爬虫爬取非网页内容等。

>> 因此只要能看懂单词就能看懂Python代码,这使得Python学习者能够很容易地通过学习别人的代码得到提高。

>> 关于获取网页,本书主要介绍了Python的两个第三方模块,一个是requests,另一个是爬虫框架Scrapy。关于解析网页内容,本书主要介绍了3种方式——正则表达式、XPath和BeautifulSoup。两种网页获取方式和3种网页解析方式可以自由搭配,随意使用。

>> 常规的反爬虫措施包括但不限于访问频率检查、验证码、登录验证、行为检测。本书对这些反爬虫策略都会进行一一破解。除此之外,本书还会将中间人攻击技术与爬虫结合在一起,再把Android自动化测试技术与爬虫结合在一起,从而构造一个超级自动化爬虫,做到几乎无法被网站发现,也无法被封锁,同时不需要人工干预就能实现数据的爬取。

>> 最后,本书会用一章来讲解和爬虫相关的法律问题,希望读者在爬虫开发领域不要触碰法律。

◆第二章 Python基础


◆ 2.1 Python的安装和运行

>> brew install python3


◆ 第三章 正则表达式与文件操作

>> 正则表达式虽然不是最简单的也不是最高效的数据提取方法,但它是最直接的。而且在某些情况下,只有使用正则表达式才能达到目的。学好正则表达式,是开发爬虫的第一步。


◆ 3.1 正则表达式

◆ 3.1.1 正则表达式介绍

正则表达式(Regular Expression)是一段字符串,它可以表示一段有规律的信息。Python自带一个正则表达式模块,通过这个模块可以查找、提取、替换一段有规律的信息。

使用正则表达式有如下步骤:
(1)寻找规律。
(2)使用正则符号表示规律。
(3)提取信息。

1 正则表达式标准符号:
1.1 点号.
    一个点号可以代替除了换行符以外的任何一个字符,
    包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号。
1.2 星号*
    一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次。
    .* 表示出现“任意多个除了换行符以外的任意字符”。
1.3 问号?
    问号表示它前面的子表达式0次或者1次。
1.4 反斜杠\
    反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号。
    在使用了反斜杠以后,反斜杠和它后面的一个字符构成一个整体,成为一个字符。
1.5 数字“\d”
    正则表达式里面使用“\d”来表示一位数字。因为d是英文“digital(数字)”的首字母。
1.6 小括号“()”
        小括号可以把括号里面的内容提取出来。前面讲到的符号仅仅能让正则表达式“表示”一串字符串。但是如果要从一段字符串中“提取”出一部分的内就需要使用小括号了。

◆ 3.1.2 正则表达式在Python中应用

方法1: re.findall 

Python的正则表达式模块包含一个findall方法,它能够以列表的形式返回所有满足要求的字符串。

re.findall(pattern, string, flags=0)

其中,pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。
findall的结果是一个列表,包含了所有的匹配到的结果。如果没有匹配到结果,就会返回空列表。

函数原型中有一个flags参数。这个参数是可以省略的。当不省略的时候,具有一些辅助功能,例如忽略大小写、忽略换行符re.S等:

在爬虫的开发过程中非常容易出现这样的情况,要匹配的内容存在换行符“\n”。要忽略换行符,就需要使用到“re.S”这个flag。虽然说匹配到的结果中出现了“\n”这个符号,不过总比什么都得不到强。内容里面的换行符在后期清洗数据的时候把它替换掉即可。
 

方法2: re.search

search()的用法和findall()的用法一样,但是search()只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。对于从超级大的文本里面只找第1个数据特别有用,可以大大提高程序的运行效率。
search()的函数原型为:

re.search(pattern, string, flags=0)

 对于结果,如果匹配成功,则是一个正则表达式的对象;如果没有匹配到任何数据,就是None。如果需要得到匹配到的结果,则需要通过.group()这个方法来获取里面的值。

只有在.group()里面的参数为1的时候,才会把正则表达式里面的括号中的结果打印出来。
.group()的参数最大不能超过正则表达式里面括号的个数。参数为1表示读取第1个括号中的内容,参数为2表示读取第2个括号中的内容,以此类推。

方法3:不需要用re.compile

◆ 重点:“.*”和“.*? ”的区别:


1.在爬虫开发中,.*?这3个符号大多数情况下一起使用。

import re

content = "我的微博密码是:1234567,QQ密码是:33445566,银行卡密码是:888888,Github密码是:999abc999,帮我记住它们"

without_question_mark = re.findall('密码是:(.*),', content)
with_question_mark = re.findall('密码是:(.*?),', content)
print('不使用问号的结果:{},长度为:{}'.format(without_question_mark, len(without_question_mark)))
print('使用问号的结果:{},长度为:{}'.format(with_question_mark, len(with_question_mark)))


# 打印结果如下:
# 不使用问号的结果:['1234567, QQ密码是:33445566, 银行卡密码是:888888, Github密码是:999abc999'],长度为:1
# 使用问号的结果:['1234567','33445566','888888','999abc999'],长度为:4

2.使用“(.*)”得到的是只有一个元素的列表,里面是一个很长的字符串。
3.使用第2个正则表达式“(.*? )”,得到的结果是包含4个元素的列表,每个元素直接对应原来文本中的每个密码。
4.举一个例子,10个人肩并肩并排站着,使用“(.*)”取到了第1个人左手到第10个人右手之间的所有东西,而使用“(.*? )”取到的是“每个人”的左手和右手之间的东西。

一句话总结如下:
①“.*”:贪婪模式,获取最长的满足条件的字符串。
②“.*? ”:非贪婪模式,获取最短的能满足条件的字符串

 ◆ 3.2 Python文件操作

1.用with这种方法不需要手动关闭文件,只要代码退出了缩进,Python就会自动关闭文件
with open('文件路径', '文件操作方式', encoding='utf-8') as f:
      
    对文件进行操作
2.文件路径可以是绝对路径,也可以是相对路径。如果是绝对路径,Linux和Mac OS不能直接使用“~”表示“home目录”,因为Python不认识“~”这个符号。如果非要使用这个符号,需要使用Python的“os”模块,这样,Python就会将这种风格的路径转化为Python能认识的绝对路径:

import os
    
real_path = os.path.expanduser('~/project/xxx')
3.如果文件是在Windows中创建的,并且使用UTF-8打开文件出现了乱码,可以把编码格式改为GBK。

4.如果原来已经有一个new.txt文件了,使用“w”会覆盖原来的文件,导致原来的内容丢失;而使用“a”,则会把新的内容写到原来的文件末尾。

5.用python打开.csv文件:由于CSV文件本质上是一个文本文件,所以需要先以文本文件的方式打开,再将文件对象传递给CSV模块(for循环得到的row是OrderedDict(有序字典),可以直接像普通字典那样使用):

with open('result.csv', encoding='utf-8') as f:
      
    reader = csv.DictReader(f)
      
    for row in reader:
        
        print(row)
 

6.读取文本内容的代码必须放在缩进内部进行,否则会导致报错。这是因为f变量里面的值是一个生成器,生成器只有在被使用(更准确的说法是被迭代)的时候才会去读文本内容。但是退出with的缩进以后,文件就被Python关闭了,这个时候当然什么都读不了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小怪的碗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值