python3学习-初识爬虫

python3学习-初识爬虫

学习了python100天内的知识,还是收获不小的,今天还是记录一下学习python的一些小知识

首先需要了解什么是网络爬虫

网络爬虫是一种互联网机器人,它通过爬取互联网上网站的内容来工作。它是用计算机语言编写的程序或脚本,用于自动从Internet上获取任何信息或数据。机器人扫描并抓取每个所需页面上的某些信息,直到处理完所有能正常打开的页面
简而言之就是利用计算机编写的程序从网站上提取我们需要的信息

一个好的程序首先需要有清晰的逻辑思维
这次的目标是爬取一个网站的图片并保存在本地

首先需要一个目标网站,
以http://sc.chinaz.com/tupian/这个网站为例
接下来需要分析图片的地址,打开firefox的审查元素功能,点击图片可以看到图片的url链接地址,访问也是没有问题的
在这里插入图片描述
在这里插入图片描述
这里需要注意一下,写正则的时候会考虑到这个问题
接下来需要python中的经典的几个库
urllib
os
re
思路是这样的。首先需要请求目标url,获取html资源,然后从html中利用正则抓取到需要的图片链接,最后保存在本地文件夹
第一步,请求url资源
代码如下


```python
from urllib import request
import urllib


def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    print(html)

html=gethtml('http://sc.chinaz.com/tupian/')

执行结果如下
在这里插入图片描述
接下来需要从html中提取图片链接,从代码中看到的response中需要的图片在

<a target="_blank" href="http://sc.chinaz.com/tupian/200818193700.htm" alt="夏天小性感日本美女图片"><img src2="http://pic1.sc.chinaz.com/Files/pic/pic9/202008/apic27135_s.jpg" alt="夏天小性感日本美女图片"></a>

这一段中,需要正则匹配.jpg的文件地址
代码如下

from urllib import request
import re
import urllib

def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    return html

def getimg(html):
    reg = '<img src2="(.*\.jpg)"'
    imgre = re.compile(reg)
    imglist=imgre.findall(html)
    return imglist

html=gethtml('http://sc.chinaz.com/tupian/')
print(getimg(html))

执行结果如下
在这里插入图片描述将链接中的图片遍历,保存到本地
代码如下

from urllib import request
import re
import os
import urllib
from urllib import parse

def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    return html

def getimg(html):
    reg = '<img src2="(.*\.jpg)"'
    imgre = re.compile(reg)
    imglist=imgre.findall(html)
    x=0
    path='D:\\test'
    if not os.path.isdir(path):
        os.makedirs(path)
    paths=path+'\\'
    for imgurl in imglist:
        urllib.request.urlretrieve(imgurl,'{0}{1}.jpg'.format(paths,x))
        x=x+1
    return imglist

html=gethtml('http://sc.chinaz.com/tupian/')
print(getimg(html))

执行结果如下

在这里插入图片描述以上就完成了对一个网页图片的抓取。
以上还存在一个问题,直接审查元素的时候,会发现图片的链接是以下链接

<img alt="夏天小性感日本美女图片" src="http://pic1.sc.chinaz.com/Files/pic/pic9/202008/apic27135_s.jpg">

和response中的html中的链接是不一样的,如果把正则表达式修改成审查元素中的链接地址是什么都抓不到的,所以,在编写表达式的时候一定要看清楚response中的链接地址
接下来尝试需要抓取多个页面的图片
再观察一下response的html代码
在这里插入图片描述继续写正则提取其中的.html界面
代码如下

from urllib import request
import re
import urllib


def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    return html
def geturls(html):
    pa='<a href="(/tupian/.*\.html)"'
    ma=re.compile(pa)
    urlslist=ma.findall(html)
    return urlslist

html=gethtml('http://sc.chinaz.com/tupian/')
print(geturls(html))

执行结果如下
在这里插入图片描述
提取出来的url链接并不是完整的链接地址,需要进行url的拼接,引入prase模块
代码如下

from urllib import request
import re
import urllib
from urllib import parse

def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    return html
def geturls(html):
    pa='<a href="(/tupian/.*\.html)"'
    ma=re.compile(pa)
    urlslist=ma.findall(html)
    return urlslist
def geturllist(html):
    for u in geturls(html):
        urls=parse.urljoin("http://sc.chinaz.com",u)
        print(urls)
html=gethtml('http://sc.chinaz.com/tupian/')
print(geturllist(html))

代码执行结果如下
在这里插入图片描述最后遍历每一个url地址,从每一个地址中提取到html资源,再从资源中提取出来其中的jpg文件保存到本地,最终代码如下

from urllib import request
import re
import urllib
import os
from urllib import parse

def gethtml(url):
    page=urllib.request.urlopen(url)
    html=page.read().decode('utf-8')
    return html
def geturls(html):
    pa='<a href="(/tupian/.*\.html)"'
    ma=re.compile(pa)
    urlslist=ma.findall(html)
    return urlslist
def geturllist(html):
    urls = [parse.urljoin("http://sc.chinaz.com",u) for u in geturls(html)]
    return urls
def getimgs(html):
    reg = '<img src2="(.*\.jpg)"'
    imgre = re.compile(reg)
    imglist = imgre.findall(html)
    x = 0
    path = 'D:\\test'
    if not os.path.isdir(path):
        os.makedirs(path)
    paths = path + '\\'
    for imgurl in imglist:
        urllib.request.urlretrieve(imgurl, '{0}{1}.jpg'.format(paths, x))
        x = x + 1
    return imglist
def gethtmls():
    x=0
    for m in urls:
        htmls=urllib.request.urlopen(m).read().decode('utf-8')
        reg = '<img src2="(.*\.jpg)"'
        imgre = re.compile(reg)
        imglist = imgre.findall(htmls)
        path = 'D:\\test'
        if not os.path.isdir(path):
            os.makedirs(path)
        paths = path + '\\'
        for imgurl in imglist:
            urllib.request.urlretrieve(imgurl,'{0}{1}.jpg'.format(paths, x))
            x = x + 1


html=gethtml('http://sc.chinaz.com/tupian/')
urls=geturllist(html)
print(gethtmls())

抓取效果
在这里插入图片描述

在这里插入图片描述
如果要提高抓取效率还可以加入线程,这个自己水平有限,就不记录了

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值