使用xpath数据采集

97 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

获取百度一下文案

获取百度首页的百度一下文案。xpath路径为'//input[@type="submit"]/@value' 也可以为//input[@id='su']/@value,都可以。

import urllib.request
url = "https://www.baidu.com"
headers = {
    'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
from lxml import etree
tree=etree.HTML(content)
value=tree.xpath('//input[@type="submit"]/@value')
print(content)
print(value)

项目实战

获取站长素材网站里的图片,并且下载到本地 首先这个网站是页面级别的。第一页的路径和其他页的路径不太一样,可能要额外特殊处理一下。 首先搞一个交互,由自己输入想获取的数据的页码的范围。然后,根据页码,定制request对象 根据定制好的request,发送请求并获取响应数据内容。然后根据数据内容,利用etree解析,然后利用xpath方法筛选素材,最后根据需要的数据img的路径和alt保存图片到本地 获取页码的交互逻辑

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)

create_request方法。主要是特化一下第一页,后面的都是拼接一个数字

def create_request(page):
    if (page == 1):
        url = 'https://sc.chinaz.com/tupian/index.html'
    else:
        url = 'https://sc.chinaz.com/tupian/index_' + str(page) + '.html'
    headers = {
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
    }
    return urllib.request.Request(url, headers=headers)

get_content方法。就是普通的获取数据,然后解析一下

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

down_load方法是比较重要的,如果抓取其他网页的数据,就改改这个方法就行了。首先获取指定容器里的图片这个没的说,每个图片都有一个alt属性,是图片的名称,每个图都是利用的假的src,真正load时才会赋值真正的src,也就是data-original属性的值,所以此时要使用这个属性。然后每个src都是没有协议的路径,如果不做拼接,会访问不到,导致报错,所以拼接上协议,如果是保存在同级目录里,数据会很混乱。所以一般会新建一个images目录,将数据保存在这,拼接一下就是如下效果

def down_load(content):
    from lxml import etree
    tree=etree.HTML(content)
    name_list=tree.xpath('//div[@js-do="goPage"]//img/@alt')
    src_list=tree.xpath('//div[@js-do="goPage"]//img/@data-original')
    print(len(src_list))
    for i in range(len(name_list)):
        name=name_list[i]
        src='https:'+src_list[i]
        urllib.request.urlretrieve(url=src,filename='./images/'+name+'.jpg')

至此,自动下载站长素材网站的图片的脚本就完成了,一次下载10页,400张图片,稍微有点小慢,但是结果是非常解压,舒服的