爬虫一:用正则表达式爬取图片

2023-11-05

爬虫流程

  1. 发起请求,通过使用HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,并等待服务器响应。
  2. 获取响应内容如果服务器能正常响应,则会得到一个Response,Response的内容就是所要获取的页面内容,其中会包含:html,json,图片,视频等。
  3. 解析内容得到的内容可能是html数据,可以使用正则表达式、第三方解析库如Beautifulsoup,etree等,要解析json数据可以使用json模块,二进制数据,可以保存或者进一步的处理。
  4. 保存数据保存的方式比较多元,可以存入数据库也可以使用文件的方式进行保存。

正则表达式

       正则表达式(regular expression),又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一些过滤逻辑。在Python中正则表达式通过re模块来实现。

                                                                                 正则表达式匹配规则

符号

说明

.

用于匹配任意一个字符,如 a.c 可以匹配 abc 、aac 、akc 等

^

用于匹配以...开头的字符,如 ^abc 可以匹配 abcde 、abcc 、abcak 等

$

用于匹配以...结尾的字符,如 abc$ 可以匹配 xxxabc 、123abc 等

*

匹配前一个字符零次或多次,如 abc* 可以匹配 ab 、abc 、abcccc 等

+

匹配前一个字符一次或多次,如 abc+ 可以匹配 abc 、abcc 、abcccc 等

?

匹配前一个字符零次或一次,如 abc? 只能匹配到 ab 和 abc

\

转义字符,比如我想匹配 a.c ,应该写成 a\.c ,否则 . 会被当成匹配字符

|

表示左右表达式任意匹配一个,如 aaa|bbb 可以匹配 aaa 也可以匹配 bbb

[ ]

匹配中括号中的任意一个字符,如 a[bc]d 可以匹配 abd 和 acd,也可以写一个范围,如 [0-9] 、[a-z] 等

( )

被括起来的表达式将作为一个分组,如 (abc){2} 可以匹配 abcabc ,a(123|456)b 可以匹配 a123b 或 a456b

{m}

表示匹配前一个字符m次,如 ab{2}c 可以匹配 abbc

{m,n}

表示匹配前一个字符 m 至 n 次,如 ab{1,2}c 可以匹配 abc 或 abbc

\d

匹配数字,如 a\dc 可以匹配 a1c 、a2c 、a3c 等

\D

匹配非数字,也就是除了数字之外的任意字符或符号,如 a\Dc 可以匹配 abc 、aac 、a.c 等

\s

匹配空白字符,也就是匹配空格、换行符、制表符等等,如 a\sc 可以匹配 'a c' 、a\nc 、a\tc 等

\S

匹配非空白字符,也就是匹配空格、换行符、制表符等之外的其他任意字符或符号,如 a\Sc 表示除了 'a c' 之外都能匹配,abc 、a3c 、a.c 等

\w

匹配大小写字母和数字,也就是匹配 [a-zA-Z0-9] 中的字符,如 a\wc 可以匹配 abc 、aBc 、a2c 等

\W

匹配非大小写字母和数字,也就是匹配大小写字母和数字之外的其他任意字符或符号,如 a\Wc 可以匹配 a.c 、a#c 、a+c 等

实战1:爬取ppt网页一级页面图片

import re,requests
#参数设置
page_num=2#页面数
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}#请求头信息,模拟浏览器进行请求

#开始爬取
for n in range(page_num):
    url='http://www.1ppt.com/beijing/ppt_beijing_{}.html'.format(n+1)
    response=requests.get(url,headers=headers)#发送请求
    if response.status_code==200:
        response.encoding=response.apparent_encoding#字符编码设置为网页本来所属编码
        html=response.text#获取网页代码
        pattern= re.compile(r'img src="(.*?jpg)" alt')#编译正则表达式
        image_url= pattern.findall(html)#解析图片链接
        for i,link in enumerate(image_url):
            print('第{}页第{}张图片下载中......'.format(n+1,i+1))
            resp=requests.get(link,headers=headers)#请求图片链接
            content=resp.content#获取二进制内容
            with open('./图片/{}-{}.jpg'.format(n+1,i+1),'wb') as f:
                f.write(content)#下载图片
    else:
        print('请求失败!')

实战2:爬取ppt网页二级页面图片

import requests,re
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}#请求头,模拟浏览器进行请求
page_num=2

for i in range(page_num):
    url='http://www.1ppt.com/beijing/ppt_beijing_{}.html'.format(i+1)
    print('第{}页爬取中......'.format(i+1))
    response=requests.get(url,headers=headers)#向一级网页发送请求
    if response.status_code==200:    
        response.encoding=response.apparent_encoding#字符编码设置为网页本来所属编码
        html=response.text#获取网页代码
        pattern=re.compile(r'<li> <a href="(.*?)" target="_blank">')#编译正则表达式
        url_sub=pattern.findall(html)#解析二级页面链接
        url_sub=['http://www.1ppt.com'+x for x in url_sub]#拼接成完整链接
        for j,link in enumerate(url_sub):
            print('第{}页第{}个ppt爬取中......'.format(i+1,j+1))
            resp=requests.get(link,headers=headers)#向二级网页发送请求
            if resp.status_code==200: 
                resp.encoding=resp.apparent_encoding#字符编码设置为网页本来所属编码
                html_sub=resp.text#获取网页代码
                pattern=re.compile(r'img src="(.*?)" width="700"')#编译正则表达式
                image_link=pattern.findall(html_sub)#解析图片链接
                for k,li in enumerate(image_link):
                    response_image=requests.get(li,headers=headers)#请求图片链接
                    content=response_image.content#获取图片二进制内容
                    with open('./图片/{}-{}-{}.jpg'.format(i+1,j+1,k+1),'wb') as f:
                        f.write(content)#下载图片   
            else:
                print('第{}页第{}个ppt链接请求失败!'.format(i+1,j+1))
    else:
        print('第{}页一级页面请求失败!'.format(i+1))

如果对你有帮助,请点下赞,予人玫瑰手有余香!

时时仰望天空,理想就会离现实越来越近!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫一:用正则表达式爬取图片 的相关文章

  • 当测试人员遇上CodeReview:揭秘代码审查绝招

    引言 测试人员的业务流程理解程度 直接影响测试用例的准确性和全面性 为了提高测试用例编写水平和测试效率 有两个关键方面需要注意 首先 通过仔细阅读需求文档并与产品经理进行充分沟通的方式可以达到这一目标 其次 通过进行代码审查来提高代码质量
  • matlab实现离散傅里叶变换及低通滤波

    如图传感器无滤波状态下FZ数据为下列 导入matlab使用工具箱分析图如下 将数据导入matlab代码 clear clc close all load data nofliter Fs 100 采集频率 T 1 Fs 采集时间间隔 信号长
  • c++对象模型探索-王健伟-专题视频课程

    c 对象模型探索 120人已学习 课程介绍 c 对象模型知识久负盛名 在c 界具有很高的美誉度 这方面知识的学习 更是被诸多颇具开发实力的行业前辈倾力推荐 本门课程内容将涉及到很多不被常人所知的 c 对象内部工作原理 底层的一些具体实现机制

随机推荐