Python 爬取图片
#Python爬取图片
目标链接:https://pic.netbian.com/4kfengjing/
思路:先通过首页的源码分析提取到子页面的链接,然后通过子页面的链接的源码来提取到图片的下载链接,我们再访问那个下载链接将他转为字节写入文件就可以生成图片
查看网页源码找到我们想要的地方
通过源码可以看出每一个.HTML的地方就是一个图片的链接
这里我们就可以拼接链接了
1 | url="https://pic.netbian.com/"#这个是大的链接 |
这里面可以找到图片的下载链接
然后定位精准一点就可以找到图片下载位置了,这里我们需要提取的是第一个因为第二个链接图片有点不对劲我也不知道哪里不对劲第二张图链接要小一点
我们可以用正则表达式来匹配提取出链接然后因为这个不全我们再和主页面的url进行拼接就可以得到下载链接
这里可以拿到网页源码
找到各个子页面的链接
定位到位置就可以进行筛选
这就是筛选出来的
1 | tup = BeautifulSoup(req.text, "html.parser")#声明是html |
我们再从我们已经提取到的页面中进行再次细分,看源码就可以知道
<a href对应的是一个链接
这样每一个链接都成了一个列表里面的元素我们再进行遍历拼接就可以得到新的链接
拼接成新的链接我们已经完成了获取子页面的链接然后我们再通过访问子页面的链接然后提取源码的关键字找到下载链接就可以了
1 | req_1 = requests.get(wangye) |
每一个div中都有一个下载链接
拿到img标签位置
我们就直接用正则表达式匹配到我们要的东西
1 | obj = re.compile(r'<img alt=".*?src="(?P<download>.*?)"', re.S)#意思是img开始中间略过匹配到src然后给它分个组我们之后单独提取出来 |
我们从数组中遍历出来拼接就是下载链接
下载链接
1 | for b in xiazai: download_1 = url_1 + b.strip("/")# # 下载图片 download_2 = requests.get(download_1) # download_2.content#这里是拿到图片的字节然后我们写入就可以了 # print(download_2.content) file_name = download_1.split("/")[-1] # 文件名字 # print(file_name) os.chdir("F:\桌面\平时源码\爬虫\img") with open(file_name, 'wb') as f: f.write(download_2.content) print("下载完成:", file_name, os.getcwd()) time.sleep(10) |
效果图
全部代码
1 | import requests |
#re模块
re模块是处理正则表达式的一个模块
1.正则表达式常用符号
(1).一般字符
字符 | 含义 |
---|---|
. | 匹配任意单个字符(不包括换行符\n) |
\ | 转义字符(把有特殊含义的字符转换成字面意思) |
[…] | 字符集。对应字符计中的任意字符 |
(2).预定字符集
字符 | 含义 |
---|---|
\d | 匹配一个数字字符。等价于[0-9] |
\D | 匹配一个非数字字符。等价于[^0-9 ] |
\s | 匹配任何空白字符,包括空格、换页符等。[\f\n\r\t\v] |
\S | 匹配任何非空白字符。 |
\w | 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9] |
\W | 匹配任何非单词字符 |
(3).数量词
字符 | 含义 |
---|---|
* | 匹配前一个字符0或无限次 |
+ | 匹配前一个字符1或无限次 |
? | 匹配前一个字符0或1次 |
{m} | 匹配前一个字符m次 |
{m,n} | 匹配前一个字符m至n次 |
(4).边界匹配
字符 | 含义 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\A | 仅匹配字符串开头 |
\Z | 仅匹配字符串结尾 |
2.re模块及其方法
(1).search函数
re模块的search()函数匹配并提取第一个符合规律的内容,返回一个正则表达式对象。
语法为:
1 | re.match(pattern, string, flags=0) |
- pattern:要匹配的正则表达式
- srting:要匹配的字符串
- flag:用于控制正则表达式的匹配方式,如:是否区分大小写多行匹配等。
只要在a这个表达式中匹配到了[0-9],便返回匹配的字符串
1 | import re |
(2).sub()函数
re模块提供了sub()函数用于替换字符串中的匹配项
语法为:
1 | re.sub(pattern, repl, string, count=0, flags=0) |
- pattern:要匹配的正则表达式
- repl:为替换的字符串
- string:为要被查找到替换的原始字符串
- counts:为模式匹配后替换的最大次数,默认0表示所有的匹配。
- flag:用于控制正则表达式的匹配方式,如:是否区分大小写多行匹配等。
(3).findall()函数
findall()函数匹配所有符合规律的内容,并以列表的形式返回结果,例如上文中的’one1two2three3’,通过search()函数只能匹配到第一个符合规律的结果,通过findall可以返回字符串所有的数字。
(4).re模块修饰符
修饰符 | 描述 |
---|---|
re.l | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使匹配包括换行在内的所有字符 |
re.U | 根据Unicod字符集解析字符。这个标志影响\w,\W,\b,\B |
re.X | 通过给予你更灵活的格式一边你将正则表达式写得更利于理解 |