re模块正则表达式:
re模块是文件处理必不可少的模块,主要应用于字符串的查找、定位等。在使用网络爬虫时,即使没有爬虫框架,re模块配合urllib3模块也可以完成简单的爬虫功能
-
字符
- .: 匹配任意除换行符“\n”以外的字符。例如.abc匹配abc
- : 转义字符,使用最后一个字符改变原来的意思,例如
a\.bc匹配a.bc
- […]: 字符集(字符集)。对应字符集中的任意字符,第一个字符是^则相反,例如
a[bc]d匹配abd和acd
-
预定义字符集
- \d:数字[0-9]
- \D:非数字
[^\d]
- \s: 空白字符
[空格\t\r\n\f\v]
- \S:非空白字符
[^\s]
- \w:单词字符
[a-zA-Z0-9]
- \W:非单词字符
[^\w]
-
数量词
-
*:匹配前一个字符0次或者无限次,例如
al*b
匹配ab、alb、a11b…。 -
+:匹配前一个字符1次或无限次,例如
al*b
匹配alb、a11b…。 -
?: 匹配前一个字符0或1次,例如
al?b
匹配ab、a1b…。 -
{m}:匹配前一个字符m次,例如
[a1{3}b]
匹配a111b。 -
{m,n}:匹配前一个字符m-n次,例如
a1{2,3}b
匹配a11b,a111b。
-
-
边界匹配
-
^:匹配字符串开头,例如
^abc
匹配以abc开头的字符串 -
: 匹配字符串结尾,例如 ‘ x y z :匹配字符串结尾,例如`xyz :匹配字符串结尾,例如‘xyz`匹配以xyz结尾的字符串
-
\A:仅匹配字符串开头,例如
\Aabc
-
\Z:仅匹配字符串结尾,例如·
xyz\Z
、
-
python的re模块,提拱了两种不同的原始操作:match和search。match是从字符串的起点开始匹配,而search(perl默认)是对字符串做任意匹配,常见的re模块方法如下:
re.compile(patten,flag=0)
:将字符串形式的正则表达式编译为python对象re.search(string[,pos[,end]])
:从string的任意位置开始匹配re.match(string[,pos[,end]])
:从string的开头开始匹配
re.findall(string[,pos[,end]])
从string的任意位置开始匹配,返回一个列表re.finditer(string[,pos[,end]])
从string的任意位置开始匹配,返回一个迭代器
简单测试
import re
s = 'I am python modules test for re modules'
a = re.search('am', s).group();
print(a)
b = re.search('I am', s).group();
print(b)
c = re.findall('am', s);
print(c)
for i in re.finditer('modules', s):
print(i.group())
输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nVyjeTV-1663853132220)(assets/image-20220922190426632.png)]
实战爬取黄桃书屋4000多页的小说名
链接地址:https://funv.me/sort/1/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ps77AF3k-1663853132221)(assets/image-20220922192908809.png)]
import re
import requests #导入模块
url='https://funv.me/sort/1/'#链接地址网址
content=requests.get(url=url).text
print(content)
运行得到以下数据: 以第一本小说为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rwQ6nqj4-1663853132222)(assets/image-20220922192807785.png)]
获取书名,作者,最新章节
bookname=re.findall('<a href="/book/\d{4,10}/">(.*?)</a>',content)#\d{4,10}匹配4到10个数字,(.*?)就是我们要获取的数据
author=re.findall('作者:(.*?)</div>',content)
last_chapter=re.findall('html">(.*?)</a>',content)
print(bookname,author,last_chapter)
输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k8PKkrG0-1663853132222)(assets/image-20220922195007891.png)]
全部代码:
import re
import requests #导入模块
headers={#请求头,删除应该也可以运行
"user_agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
url='https://funv.me/sort/1/'#链接地址网址
content=requests.get(url=url).text
print(content)
bookname=re.findall('<a href="/book/\d{4,10}/">(.*?)</a>',content)#\d{4,10}匹配4到10个数字,(.*?)就是我们要获取的数据
author=re.findall('作者:(.*?)</div>',content)
last_chapter=re.findall('html">(.*?)</a>',content)
print(bookname,author,last_chapter)
爬取4000多页的全部小说
首先关注每一页的网址:
第一页:https://funv.me/sort/1/
第二页:https://funv.me/sort/2/
第三页:https://funv.me/sort/3/
已经很明显了,只是后面的数字发生变化,现在我们用循环语句来爬取,并写入excel
这里需要添加一个cookie和headers,按下F12,点击network
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrJaDf6x-1663853132223)(assets/image-20220922200424045.png)]
**代码如下:**这里只爬取了100页,毕竟我有点慌
import re
import requests #导入requests模块,需要下载
import csv#导入csv模块
with open("黄桃小说.csv",mode="w",encoding="utf-8") as f:
csv_writer = csv.writer(f)
csv_writer.writerow(['小说名','作者','最新章节'])
headers={
'cookie':'这里更换自己的cookie,useagent可以不用更改',
"user_agent": 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36'
}
for i in range(1,100):#把100改成4000就是爬取4000页的数据
url=f'https://funv.me/sort/{i}/'#链接地址网址
content=requests.get(url=url,headers=headers).text
# print(content)
bookname=re.findall('<a href="/book/\d{4,10}/">(.*?)</a>',content)#\d{4,10}匹配4到10个数字,(.*?)就是我们要获取的数据
author=re.findall('作者:(.*?)</div>',content)
last_chapter=re.findall('html">(.*?)</a>',content)
for i in range(10):
Bookname=bookname[i]
Author=author[i]
Last_chapter=last_chapter[i]
with open("黄桃小说.csv", mode="a", encoding="utf-8") as f:
csv_writer = csv.writer(f)
csv_writer.writerow([Bookname,Author,Last_chapter])
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-44gRspdg-1663853132223)(assets/image-20220922201407521.png)]