分类 Python 下的文章

Lativ网站仿制第一阶段完成

爬取所有图片:

    # 获取Lativ网站的所有图片

# 步骤:
# 1- 获取图片的URL
# 2- 把图片下载下来
# 3- 保存的时候重命名文件(这里需要用到正则表达式)

from urllib.request import urlopen
from urllib.request import urlretrieve
from bs4 import BeautifulSoup
import re;
#通过imageSrc取得函数名称
def getImageName(imageSrc):
    pattern = re.compile(r'/+');
    match = re.split(pattern,imageSrc);
    return match[-1];

html = urlopen("http://www.lativ.com")
i= 1;
# print(html.read())
bsObj = BeautifulSoup(html,"html.parser")
for link in bsObj.findAll("img"):
    if 'data-original' in link.attrs:
        imageName = getImageName(link.attrs['data-original'])
        i = i+1;
        urlretrieve(link.attrs['data-original'],'./LativImages/'+imageName)
        print("保存第"+str(i)+"图片成功")
    else:
        imageName = getImageName(link.attrs["src"])
        i = i+1
        urlretrieve(link.attrs['src'],'./LativImages/'+imageName)
        print("保存第"+str(i)+"图片成功")

# for link in bsObj.findAll('img'):
    # print(link.attrs)
    # print("*"*10)

# link = bsObj.find('img')
# print(link.attrs['data-original'])


基本所有的小知识前面都讲过了。很简单的爬虫。今天突然发现Lativ官网上有穿搭栏了。我做爬虫的起因就是模特穿衣服好看哈哈哈,过会弄下来。

中间遇到了几个小问题。

  1. 面对下面的布局

刚开始我总是把1234分成4个div,采用浮动的方式对他们进行布局,愣是没有成功。
转换一下思路,分成3组(2和3看成一组),这样3组divfloat设为left,然后23再分开就简单多了。思路才是最重要的。
分享两篇文章:
W3School对于float的讲解
非常浅显易懂,墙裂推荐

  1. ulli横向布局及常用设置
    list-style-type:设置列表前面的样式
    float属性设为left即可变为横向布局

  2. 尽量所有的元素都放在div中进行布局。显得整体比较统一

  3. 还未完成的功能就是js的代码,前面的大图滚动还没做。

结果:

代码好多就不粘贴了。

这里介绍下共享文件

网上有好多方法。
可以参考这个

最重要的可能是后面的步骤,共享给特定用户的时候选择Guest用户,给他读写权限。然后你就可以在浏览器中输入smb://PC名,比如我的就是smb://Lvkui-pc,然后就可以访问其中的内容了。还是非常方便的。

正则表达式学习

最近看了一点网页前端的东西,想模仿一下Lativ官网这个页面,大体想了几个步骤

    1. Python爬取网页的所有图片
      获取所有链接(前面写过这部分),这里遇到了小问题,就是lativ网站的图片是延迟加载的,在获得源码中,img标签下src属性如果没有访问到的话,是一个grey.gif不符合我们的要求,这时候该怎么办,下一篇中解答
      现在的到了所有的链接了,保存的时候得把文件名取出来,就用到正则表达式,这篇文章讲的就是这部分的内容,最后的栗子就是解决这个问题,当然大题小做了,权当学习

    1. HTML+CSS布局(上面的都完成了,这个还没做。。。。)


    正则表达式学习

    正则表达式说白了就是一种规则,人们根据这种通用的规则可以对字符串做一些简洁的操作。使用普通的方式写一些查找过滤函数可能需要一坨代码,使用正则可能就是一行代码。正则表达式在不同的开发语言中都有应用,规则差不多,这里以Java为例,结尾给出Python的例子

    正则表达式规则

    预定义字符类

    符号

    代表的意义

    *

    匹配前面的字符、子表达式或括号里面的字符0次或多次

    \d

    数字:【0-9】

    \D

    非数字:【^0-9】

    \s

    空白字符

    \S

    非空白字符【^s】

    \w

    单词字符【a-zA-Z_0-9】

    \W

    非单词字符 【^w】

    数量词

    X?

    X一次或一次也没有

    X*

    X,零次或多次

    X+

    X,一次或多次

    X{n}

    X,恰好n次

    X{n,}

    X,至少n次

    X{n,m}

    X,至少n次,不超过m次

    范围表示
    [abc]

    a、b、或c(匹配一个字符)

    [^abc]

    任何字符,除了a、b、c

    a-zA-Z

    a到z或者A到Z,两头的字母包括在内
    &代表并集

    正则表达式的方法

    不同的语言函数不一样,基本的就是下面这几个,具体情况下查API即可

    • 匹配match

    • 切割split

    • 替换replaceAll

    • 查找search

    Python举几个栗子

    Python是通过re模块提供对正则表达式的支持,使用正则表达式方法是先将正则表达式编程成pattern实例,使用pattern实例处理文本并获得match匹配结果,然后使用match实例获得信息,进行其他的操作
    比如如下把网址中分割出图片名字

    ~~ import re;
    ~~ s = "http://s1.lativ.com/i/Page/images/share/footer-weixin.gif"
    ~~ pattern = re.compile(r'/+')
    ~~ match = re.split(pattern,s)
    ~~ print(match[-1])
    ~~ #输出结果
    ~~ footer-weixin.gif

    参考了某培训机构的讲义和讲得很棒

    Python坑记录

    主要记录学习python中遇到的一些坑,不定时更新


    1. TypeError: string indices must be integers异常

    出现的场景是:

    resultText = r.text
    print(resultText['code'])
    

    这里通过r.tex获取到的数据为{"code":1,"msg":"连续输入密码错误超过5次,请12小时后再试"},我以为这个是字典类型,直接按照上面的方式进行取值,就会出现TypeError异常。
    我直接进去python命令行调试,却是可以得到数据

    解决方法
    导入json库进行解析

    import json
    result = json.loads(r.text)
    print(result.get('msg'))
    #print(result['msg'])

    原因
    r.text返回的数据被解析为str类型,不是dict。手动转换一下就好了

    2.安装Selenium
    直接通过pip安装出错,需要下载源代码,通过install安装
    selenium官方网站,下载selenium页面,里面也包含了安装方法。在python2中使用setup.py install命令好像还是有问题。使用python3 setup.py install安装解决
    顺便安装 PlantomJS,是一个功能完善没有界面的浏览器。官方网站,备用

    我的第一个Python小爬虫

    前段时间看到Lativ官网衣服挺好看的,本来想把模特的照片全都弄下来的,现在已经没有那个模特集合的页面了,这都是废话,重点是我终于写出了第一个python小爬虫。


    from urllib.request import urlopen
    from urllib.request import urlretrieve
    from bs4 import BeautifulSoup
    
    # 获取网页内容
    # html_doc =urlopen('http://www.pythonscraping.com/pages/page3.html')
    html_doc = urlopen('http://www.baihe.com')
    # 新建BeautifulSoup对象
    soup = BeautifulSoup(html_doc,'html.parser')
    # 打印所有的图片链接
    # for img in soup.findAll('img'):
    #     print(img['src'])
    i = 1
    for img in soup.select('img'):
        print(img['src'])
        # print('./Image/'+str(i)+'.jpg')
        print('正在保存第%d个图片'%i)
        # 将得到的图片下载下来保存到本地
        urlretrieve(img['src'],'./Image/'+str(i)+'.jpg')
        i+=1

    代码非常简单,可也写了一个晚自习。也有很多方面没有实现好

    • 暂时没有提供选择, 只下载了百合网的照片

    • 找到img中标签必须有src属性,src链接必须得是网址

    • 保存的时候img中有两张图片后缀是gif的没有做处理

    • 保存路径没有提供选择

    • 报名文件名是数字不直观

    • 想找的话还有好多。。。。

    不过这些都够了,至少保存了一些照片。截图为证
    啦啦啦

    我也太俗了,哈哈。
    最近修改努力让它变成一个厉害的蜘蛛,爬啊爬。