python3学习-初识爬虫

   日期:2020-09-02     浏览:96    评论:0    
核心提示:python3学习-初识爬虫学习了python100天内的知识,还是收获不小的,今天还是记录一下学习python的一些小知识首先需要了解什么是网络爬虫网络爬虫是一种互联网机器人,它通过爬取互联网上网站的内容来工作。它是用计算机语言编写的程序或脚本,用于自动从Internet上获取任何信息或数据。机器人扫描并抓取每个所需页面上的某些信息,直到处理完所有能正常打开的页面简而言之就是利用计算机编写的程序从网站上提取我们需要的信息一个好的程序首先需要有清晰的逻辑思维这次的目标是爬取一个网站的图片并保存在

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())

抓取效果


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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服