Python爬虫学习,尚硅谷站长素材 ,经历与总结

起初我是在B站上跟着尚硅谷老师进行学习,我的习惯是一开始先进行需要使用的方法进行倒入

import urllib.request
from lxml import etree

这分别倒入了爬虫最基础的两个库,一个是request用于进行数据的访问与获取,lxml就是配合浏览器上的xpath使用,进行数据提取。

开始先写一个main函数

if __name__ == '__main__':
    start_page = int(input('请输入起始页码:'))
    end_page = int(input('请输入结束页码:'))

    for page in range(start_page, end_page + 1):
        request = create_request(page)
        content = get_content(request)
        down_load(content)

这个函数是让人选择所爬取的数据页数,我这次的任务是爬取站长素材的图片,我选择的是站长素材里面大海的图片

让后让我们开启F12进入开发者工具进行数据查询,获取我们所需的信息,我先进入的是网络这个部分,找到了这个网页的主目标,就是这个get

然后我们进入代码敲下create_request()函数,这个函数主要是用于让我们以访客的身份进行爬取数据,这个cookie和accept可加可不加,我为了保险就加了,这个request主要是为了封装内容,这其中涉及到了一个反爬手段就是一些网站的开头是https的他们就需要我们加入user-agent给他进行识别,就像进小区要刷卡这样。

def create_request(page):
    if page == 1:
        url = 'https://sc.chinaz.com/tupian/dahaitupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/dahaitupian_' + str(page) + '.html'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
        # 'Cookie': '3551364119;cz_statistics_visitor=d006f113-f57e-3a1a-17da-71e29f11c8f4;Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1724651622;HMACCOUNT=25D6C8CAC39BB6DD;Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1724652222',
        # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
    }

    request = urllib.request.Request(url=url, headers=headers)
    return request

接下来我们就要进行访问了,创建get_content(request)函数,这个返回值是环环相扣的所以必须写

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content

接下来就是重头戏了,我在这发现了许多的问题,我们需要创建一个下载函数down_load(content)

他需要get_content()函数的返回值,我们先进入到浏览器去到元素环节,

我们想要的数据是图片与它的标题,我们可以通过图片找到它的src和alt,这两个是我们需要的,这时打开xpath,明确我们的目标

这里面一开始我是跟尚硅谷敲的代码是一样的,但是我发现没有id,我就选择了img上面的class,xpath里面显示的也是对的内容

让后我就敲入pycharm了(但是因为是图片不明显,我换成了文字@alt),这段代码会输出我所拿到的内容,内容应该跟xpath一样

def down_load(content):
    tree = etree.HTML(content)
    name_list = tree.xpath('//div[@class="item masonry-brick"]/img/@alt')

    for i in range(len(name_list)):
        name = name_list[i]
        print(name)

问题出现了,我发现我的python拿不到内容

这应该是python与xpath内容冲突导致,xpath可以提取的python不一定能拿到,之后我就换了一个

name_list = tree.xpath('//div[@data-marginr=16]//@alt')

这个就没问题了,后面我发现了一个非常有趣的事,下载图片时,现如今的懒加载和之前src2的时候不一样,它是直接在src里面进行懒加载,你在里面不能获得完整的网址,所以我们要更改,我这里选用的依然是data-original,你在我之前的图片发现src可能是完整的但是刷新后它就变了,我们往下滑,那些未加载出的图片

很明显它不是完整的,但是我们爬虫现在没办法去滑动刷新,我们只能去其他地方进行提取。

总结

我发现学习路上不是所有东西都是和教的一样,有些事有些东西可能只有你自己能碰到,所以需要随机应变,可能我比较笨,不过无所谓了,我一个小菜鸟,只是给学习路上的人一点小小的提示,万一一样呢。后面附上源码和运行结果

import urllib.request
from lxml import etree


def create_request(page):
    if page == 1:
        url = 'https://sc.chinaz.com/tupian/dahaitupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/dahaitupian_' + str(page) + '.html'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
        # 'Cookie': '3551364119;cz_statistics_visitor=d006f113-f57e-3a1a-17da-71e29f11c8f4;Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1724651622;HMACCOUNT=25D6C8CAC39BB6DD;Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1724652222',
        # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
    }

    request = urllib.request.Request(url=url, headers=headers)
    return request


def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content


def down_load(content):
    tree = etree.HTML(content)
    name_list = tree.xpath('//div[@data-marginr=16]//@alt')
    src_list = tree.xpath('//img[@class="lazy"]/@data-original')
    for i in range(len(name_list)):
        name = name_list[i]
        print(name)

        src = src_list[i]
        url='https:'+ src
        urllib.request.urlretrieve(url=url, filename=name+'.jpg')



if __name__ == '__main__':
    start_page = int(input('请输入起始页码:'))
    end_page = int(input('请输入结束页码:'))

    for page in range(start_page, end_page + 1):
        request = create_request(page)
        content = get_content(request)
        down_load(content)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值