python学习(24) 使用Xpath解析并抓取美女图片

Xpath最初用来处理XML解析,同样适用于HTML文档处理。相比正则表达式更方便一些

Xpath基本规则

nodename   表示选取nodename 节点的所有子节点
/          表示当前节点的直接子节点
//         表示当前节点的子节点和孙子节点
.          表示当前节点
..         当前节点的父节点
@          选取属性

下面举例使用下

text = ‘‘‘
<div class="bus_vtem">
        <a href="https://www.aisinei.org/thread-17826-1-1.html" title="XINGYAN星颜社 2018.11.09 VOL.096 唐思琪 [47+1P]" class="preview"  target="_blank">
        <img src="https://i.asnpic.win/block/74/74eab64cfa4229d58c19a64970368178.jpg" width="250" height="375" alt="XINGYAN星颜社 2018.11.09 VOL.096 唐思琪 [47+1P]"/>
                <span class="bus_listag">XINGYAN星颜社</span>
        </a>
        <a href="https://www.aisinei.org/thread-17826-1-1.html" title="XINGYAN星颜社 2018.11.09 VOL.096 唐思琪 [47+1P]"  target="_blank">
            <div class="lv-face"><img src="https://www.aisinei.org/uc_server/avatar.php?uid=2&size=small" alt="发布组小乐"/></div>
            <div class="t">XINGYAN星颜社 2018.11.09 VOL.096 唐思琪 </div>
            <div class="i"><span><i class="bus_showicon bus_showicon_v"></i>5401</span><span><i class="bus_showicon bus_showicon_r"></i>1</span></div>
        </a>
    </div>
‘‘‘
from lxml import etree
html = etree.HTML(text)
result = etree.tostring(html)
#打印lxml生成的字符串,如果html格式不全,会自动补全
print(result.decode(‘utf-8‘))
# 打印根节点下所有子孙节点
result2 = html.xpath(‘//*‘)
print(result2)
result3 = html.xpath(‘//a[@class="preview"]‘)
print(result3)

result.decode(‘utf-8’) 可以补全缺失的html格式字符串
html.xpath(‘//*’)查找根节点下所有子孙节点
html.xpath(‘//a[@class=”preview”]’) 在根节点所有子孙节点中找到属性class为preview的a节点。

lxml同样可以读取文件

from lxml import etree
html = etree.parse(‘./test.html‘,etree.HTMLParser())

lxml 操作子节点

from lxml import etree
html = etree.HTML(text)
result = html.xpath(‘//bus/a‘)

操作父节点

from lxml import etree
html = etree.HTML(text)
result = html.xpath(‘//a[@class="preview"]/../@class‘)
print(result)

先找到class属性为preview的a节点,然后找到其父节点,接着筛选父节点的class属性,打印结果为[‘bus_vtem’]

属性匹配

上面已经写过了格式为: 节点名[@属性名=”属性值”]

属性获取

上面已经谢过了,格式为: 节点名/@属性名,注意这里没有[]

多属性值匹配

上面的节点bus 属性class 只有一个值bus_vtem,如果新增一个值mtest,那么属性匹配要更换为contains,不然会报错

from lxml import etree
text2 = ‘‘‘
        <div class="bus_vtem  mtest"> hurricane!
        </div>
    ‘‘‘
html2 = etree.HTML(text2)
result5 = html2.xpath(‘//*[contains(@class, "mtest")]‘)
# 错误用法
#result5 = html.xpath(‘//*[@class="mtest"]‘)
print(result5)

多属性匹配

多属性匹配用于筛选一个节点时非常方便,各个属性的判断可以用 and or != == 等操作

from lxml import etree
text3 = ‘‘‘
        <div class="bus_vtem mtest" name="hurricane"> hurricane!
        </div>
        <div class="bus_vtem mtest" name = "tornado"> tornado!
        </div>
    ‘‘‘
html3 = etree.HTML(text3)
result6 = html3.xpath(‘//*[contains(@class, "mtest") and @name="hurricane"]/text()‘)
print(result6)

文本获取

在节点后加/text()即可,如
result6 = html3.xpath(‘//*[contains(@class, “mtest”) and @name=”hurricane”]/text()’)

下面结合前边讲述的request,cookie,以及今天的lxml知识,实战爬取艾丝新发布的美女图片地址,代码如下

import requests
import re
import time
from lxml import etree

USER_AGENT = ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0‘
COOKIES = r‘__cfduid=d78f862232687ba4aae00f617c0fd1ca81537854419; bg5D_2132_saltkey=jh7xllgK; bg5D_2132_lastvisit=1540536781; bg5D_2132_auth=479fTpQgthFjwwD6V1Xq8ky8wI2dzxJkPeJHEZyv3eqJqdTQOQWE74ttW1HchIUZpgsyN5Y9r1jtby9AwfRN1R89; bg5D_2132_lastcheckfeed=7469%7C1541145866; bg5D_2132_st_p=7469%7C1541642338%7Cda8e3f530a609251e7b04bfc94edecec; bg5D_2132_visitedfid=52; bg5D_2132_viewid=tid_14993; bg5D_2132_ulastactivity=caf0lAnOBNI8j%2FNwQJnPGXdw6EH%2Fj6DrvJqB%2Fvv6bVWR7kjOuehk; bg5D_2132_smile=1D1; bg5D_2132_seccode=22485.58c095bd095d57b101; bg5D_2132_lip=36.102.208.214%2C1541659184; bg5D_2132_sid=mElHBZ; Hm_lvt_b8d70b1e8d60fba1e9c8bd5d6b035f4c=1540540375,1540955353,1541145834,1541562930; Hm_lpvt_b8d70b1e8d60fba1e9c8bd5d6b035f4c=1541659189; bg5D_2132_sendmail=1; bg5D_2132_checkpm=1; bg5D_2132_lastact=1541659204%09misc.php%09patch‘
class AsScrapy(object):
    def __init__(self,pages=1):
        try:
            self.m_session = requests.Session()
            self.m_headers = {‘User-Agent‘:USER_AGENT,
                        #‘referer‘:‘https://www.aisinei.org/‘,
                        }

            self.m_cookiejar = requests.cookies.RequestsCookieJar()
            for cookie in COOKIES.split(‘;‘):
                key,value = cookie.split(‘=‘,1)
                self.m_cookiejar.set(key,value)
        except:
            print(‘init error!!!‘)
    def getOverView(self):
        try:
            req = self.m_session.get(‘https://www.aisinei.org/portal.php‘,headers=self.m_headers, cookies=self.m_cookiejar, timeout=5)
            html = etree.HTML(req.content.decode(‘utf-8‘))
            #result=html.xpath(‘//div[@class="bus_vtem"]/a[@title!="紧急通知!紧急通知!紧急通知!"]/attribute::*‘)
            #print(result)
            htmllist = html.xpath(‘//div[@class="bus_vtem"]/a[@title!="紧急通知!紧急通知!紧急通知!" and @class="preview"]/@href‘)
            titlelist = html.xpath(‘//div[@class="bus_vtem"]/a[@title!="紧急通知!紧急通知!紧急通知!" and @class="preview"]/@title‘)
            print(htmllist)
            print(titlelist)
            print(len(htmllist))
            print(len(titlelist))
            time.sleep(1)
            pass
        except:
            print(‘get over view error‘)

if __name__ == "__main__":
    asscrapy = AsScrapy()
    asscrapy.getOverView()

通过lxml分析,可以摘取资源地址

接下来爬取图片,读者可以发送request请求即可,留作课后题吧。
源码下载地址
https://github.com/secondtonone1/python-
谢谢关注我的公众号

原文地址:https://www.cnblogs.com/secondtonone1/p/9979596.html

时间: 2024-08-29 14:00:17

python学习(24) 使用Xpath解析并抓取美女图片的相关文章

python学习第一弹:爬虫(抓取博客园新闻)

前言 说到python,对它有点耳闻的人,第一反应可能都是爬虫~ 这两天看了点python的皮毛知识,忍不住想写一个简单的爬虫练练手,JUST DO IT 准备工作 要制作数据抓取的爬虫,对请求的源页面结构需要有特定分析,只有分析正确了,才能更好更快的爬到我们想要的内容. 打开博客园任何一个新闻页面,比如https://news.cnblogs.com/n/570973/,思路是通过这个源页面,并且根据页面中的“上一篇”.“下一篇”等链接,源源不断的爬取其它新闻内容. 浏览器访问https://

python学习(十五) 屏幕抓取

15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签(<p>)结束一段然后开始下一段,而在XHTML中,首先要显示的关闭当前段落(</p>),  这种行为让XHTML更容易解析, 另外一个好处是:它是XML的一种,可以对他使用XML工具,例如xpath. 解析XTML用HTMLParser. 15.1.2 Beautiful Soup

Python爬虫 —— 抓取美女图片

代码如下: 1 #coding:utf-8 2 # import datetime 3 import requests 4 import os 5 import sys 6 from lxml import etree 7 import codecs 8 9 class Spider: 10 def __init__(self): 11 self.headers = {} 12 self.headers['User_Agent'] = 'Mozilla/5.0 (Windows NT 10.0;

python 抓取美女图片

之前见过别人写的抓取图片的python脚本,自己之前用正则写过,最近看到beautifulsoup 所以拿来练练手 # -*- coding:utf8 -*- from bs4 import BeautifulSoup import os, sys, urllib2,time,random   path = os.getcwd()                      new_path = os.path.join(path,u'sexy') if not os.path.isdir(new

python学习笔记-抓取网页图片脚本

初学者一枚,代码都是模仿网上的.亲测可用~ 运行脚本的前提是本机安装了httplib2模块 #!/usr/bin/python import os import re import string import urllib #author:reed #date:2014-05-14 def GetWebPictures(): url=raw_input('please input the website you want to download:') imgcontent=urllib.urlo

Python 爬虫工程师必学 App数据抓取实战

第1章 课程介绍介绍课程目标.通过课程能学习到的内容.学会这些技能能做什么,对公司业务有哪些帮助,对个人有哪些帮助.介绍目前app数据抓取有哪些困难,面临的挑战,本实战课程会利用哪些工具来解决这些问题,以及本实战课程的特点 ... 1-1 python爬虫工程师必备技能--App数据抓取实战课程导学第2章 windows下搭建开发环境介绍项目开发需要安装的开发软件,讲解了安卓模拟器对比以及夜神安卓模拟器安装.介绍.简单使用和Genymotion安卓模拟器简单分析 介绍App应用抓包工具对比以及f

Python -- 网络编程 -- 抓取网页图片 -- 图虫网

字符串(str)编码成字节码(bytes),字节码解码为字符串 获取当前环境编码:sys.stdin.encoding url编码urllib.parse.quote() url解码urllib.parse.unquote() 列表去重:pages = list(set(pages)) 创建文件夹(可多级创建):os.makedirs(folder)  os.mkdir()只能单级创建 首先分析网页(图虫网)的URL规律: 根网页地址形如: http://tuchong.com/tags/人像/

python爬虫----(6. scrapy框架,抓取亚马逊数据)

利用xpath()分析抓取数据还是比较简单的,只是网址的跳转和递归等比较麻烦.耽误了好久,还是豆瓣好呀,URL那么的规范.唉,亚马逊URL乱七八糟的.... 可能对url理解还不够. amazon ├── amazon │   ├── __init__.py │   ├── __init__.pyc │   ├── items.py │   ├── items.pyc │   ├── msic │   │   ├── __init__.py │   │   └── pad_urls.py │  

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc