回顾 bs4

  • 实例化bs对象,将页面源码数据加载到该对象中
  • 定位标签:find('name',class_='xxx') findall() select()
  • 将标签中的文本内容获取 string text get_text() a['href']

xpath

环境安装: pip install lxml

原理解析:

获取页面的源码数据

实例化etree对象,并将页面源码数据加载到该对象中

调用该对象xpath方法进行指定标签的定位

注意:xpath必须结合者xpath的表达式进行标签定位和内容捕获

/html/head/title
//head/title
//title

通过xpath进行获取数据

  1. #项目需求:解析58二手房的相关数据
  2. import requests
  3. from lxml import etree
  4.  
  5. url = 'https://bj.58.com/shahe/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d30000c-0047-e4e6-f587-683307ca570e&ClickID=1'
  6. headers = {
  7. 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
  8. }
  9. page_text = requests.get(url=url,headers=headers).text
  10.  
  11. tree = etree.HTML(page_text)
  12. li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')
  13. fp = open('58.csv','w',encoding='utf-8')
  14. for li in li_list:
  15. title = li.xpath('./div[2]/h2/a/text()')[0]
  16. price = li.xpath('./div[3]//text()')
  17. price = ''.join(price)
  18. fp.write(title+":"+price+'\n')
  19. fp.close()
  20. print('over')
  21.  
  22. #调用xpath 返回的是一个列表结构,使用索引

利用xpath处理中文乱码

  1. # ctrl+shift+x
  2. # - 解析图片数据:http://pic.netbian.com/4kmeinv/
  3. import requests
  4. from lxml import etree
  5. import os
  6. import urllib
  7.  
  8. url = 'http://pic.netbian.com/4kmeinv/'
  9. headers = {
  10. 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
  11. }
  12. response = requests.get(url=url,headers=headers)
  13. #response.encoding = 'utf-8'
  14. if not os.path.exists('./imgs'):
  15. os.mkdir('./imgs')
  16. page_text = response.text
  17.  
  18. tree = etree.HTML(page_text)
  19. li_list = tree.xpath('//div[@class="slist"]/ul/li')
  20. for li in li_list:
  21. img_name = li.xpath('./a/b/text()')[0]
  22. #处理中文乱码
  23. img_name = img_name.encode('iso-8859-1').decode('gbk')
  24. img_url = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
  25. img_path = './imgs/'+img_name+'.jpg'
  26. urllib.request.urlretrieve(url=img_url,filename=img_path)
  27. print(img_path,'下载成功!')
  28. print('over!!!')
  29.  
  30. #通过encode('iso-8859-1').decode('gbk')编译
    #或使用response.encoding = 'utf-8'

xpath在遇到加密base64时解决加密a标签

  1. #【重点】下载煎蛋网中的图片数据:http://jandan.net/ooxx
  2. #数据加密 (反爬机制)
  3. import requests
  4. from lxml import etree
  5. import base64
  6. import urllib
  7.  
  8. headers = {
  9. 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
  10. }
  11. url = 'http://jandan.net/ooxx'
  12. page_text = requests.get(url=url,headers=headers).text
  13.  
  14. tree = etree.HTML(page_text)
  15. img_hash_list = tree.xpath('//span[@class="img-hash"]/text()')
  16. for img_hash in img_hash_list:
  17. img_url = 'http:'+base64.b64decode(img_hash).decode()
  18. img_name = img_url.split('/')[-1]
  19. urllib.request.urlretrieve(url=img_url,filename=img_name)

xpath获取两次a标签进行获取及分页判断

  1. #爬取站长素材中的简历模板
  2. import requests
  3. import random
  4. from lxml import etree
  5. headers = {
  6. 'Connection':'close', #当请求成功后,马上断开该次请求(及时释放请求池中的资源)
  7. 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
  8. }
  9. url = 'http://sc.chinaz.com/jianli/free_%d.html'
  10. for page in range(1,4):
  11. if page == 1:
  12. new_url = 'http://sc.chinaz.com/jianli/free.html'
  13. else:
  14. new_url = format(url%page)
  15.  
  16. response = requests.get(url=new_url,headers=headers)
  17. response.encoding = 'utf-8'
  18. page_text = response.text
  19.  
  20. tree = etree.HTML(page_text)
  21. div_list = tree.xpath('//div[@id="container"]/div')
  22. for div in div_list:
  23. detail_url = div.xpath('./a/@href')[0]
  24. name = div.xpath('./a/img/@alt')[0]
  25.  
  26. detail_page = requests.get(url=detail_url,headers=headers).text
  27. tree = etree.HTML(detail_page)
  28. download_list = tree.xpath('//div[@class="clearfix mt20 downlist"]/ul/li/a/@href')
  29. download_url = random.choice(download_list)
  30. data = requests.get(url=download_url,headers=headers).content
  31. fileName = name+'.rar'
  32. with open(fileName,'wb') as fp:
  33. fp.write(data)
  34. print(fileName,'下载成功')
  35.  
  36. //*[@id="down"]/div[2]/ul/li[6]/a

xpath 利用 |  实现并集获取数据

  1. #解析所有的城市名称
  2. import requests
  3. from lxml import etree
  4. headers = {
  5. 'Connection':'close', #当请求成功后,马上断开该次请求(及时释放请求池中的资源)
  6. 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
  7. }
  8. url = 'https://www.aqistudy.cn/historydata/'
  9. page_text = requests.get(url=url,headers=headers).text
  10.  
  11. tree = etree.HTML(page_text)
  12. li_list = tree.xpath('//div[@class="bottom"]/ul/li | //div[@class="bottom"]/ul/div[2]/li')
  13. for li in li_list:
  14. city_name = li.xpath('./a/text()')[0]
  15. print(city_name)

proxies 代理设置

  1. #设置请求的代理ip: www.goubanjia.com 快代理 西祠代理
  2. #代理ip的类型必须和请求url的协议头保持一致
  3. url = 'https://www.baidu.com/s?wd=ip'
  4.  
  5. page_text = requests.get(url=url,headers=headers,proxies={'https':'61.7.170.240:8080'}).text
  6.  
  7. with open('./ip.html','w',encoding='utf-8') as fp:
  8. fp.write(page_text)

防卫机制:
robots

UA

数据加密

懒加载

代理ip

爬虫 xpath 获取方式的更多相关文章

  1. Scrapy:运行爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...

  2. 放养的小爬虫--京东定向爬虫(AJAX获取价格数据)

    放养的小爬虫--京东定向爬虫(AJAX获取价格数据) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wang/Sp ...

  3. Appium根据xpath获取控件

    如文章< Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通 ...

  4. Appium依据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.当中一种就是依据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  5. 【转】Appium根据xpath获取控件实例随笔

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39754233 如文章<Appium基于安卓的各种FindElement的控件定位方法 ...

  6. Appium根据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  7. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

  8. 爬虫, 获取登录者的外网IP

    笔者学习了一下用爬虫, 获取登录者的外网IP. 首先导入Jsoup的jar包 public class RetrivePage { private static String url="ht ...

  9. [转]Android SHA1与Package获取方式

    转自高德地图LBS Android SHA1与Package获取方式 获取应用包名 打开Android 应用工程的 AndroidManifest.xml配置文件,package 属性所对应的内容为应 ...

随机推荐

  1. 【Https异常】This request has been blocked; the content must be served over HTTPS

    一.问题出现场景 项目从http升级到https后,jsp页面存在发送http请求的情况下就会出现该异常.因为HTTPS 是 HTTP over Secure Socket Layer,以安全为目标的 ...

  2. Java学习笔记(6)---正则表达式,方法

    1.正则表达式: a.定义: 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 在Java,一个字符串其实就是一 ...

  3. 手工挖掘web常见漏洞时的一些经验总结

    一.前提: 漏洞挖掘原则 所有变量 所有头 cookie中的变量 逐个变量删除 漏洞的本质 数据与指令的混淆 对用户输入信息过滤不严判断失误,误将数据当指令 二.经典漏洞: 1.身份认证 常用弱口令/ ...

  4. acwing 651. 逛画展

    地址 https://www.acwing.com/problem/content/653/ 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那 ...

  5. WPF 精修篇 样式继承

    原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...

  6. <Graph> Topological + Undirected Graph 310 Union Find 261 + 323 + (hard)305

    310. Minimum Height Trees queue:  degree为1的顶点 degree[ i ] : 和 i 顶点关联的边数. 先添加整个图,然后BFS删除每一层degree为1的节 ...

  7. IT兄弟连 Java语法教程 数组 深入数组 内存中的数组

    数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的.下面将深入介绍数组在内存中的运行机制. 内存中的数组 数组引用变量只是一个引用,这个引用变量可以指向任何有效的 ...

  8. pytorch_模型参数-保存,加载,打印

    1.保存模型参数(gen-我自己的模型名字) torch.save(self.gen.state_dict(), os.path.join(self.gen_save_path, 'gen_%d.pt ...

  9. 09-Django静态文件

    1.静态文件 项目中的图片.CSS.js都是静态文件,一般会将静态文件放到一个单独的目录下,也方便管理.一般会将静态文件放到一个单独的目录下,也可以放在应用的目录下,由于静态文件是全部应用都在使用的, ...

  10. pytest框架之rerunfailures失败重运行机制

    web自动化测试中,稳定性在整个测试运行中都至关重要,但不能保证测试脚本或者测试环境一直都能够稳定,它牵扯到诸多因素,在这里就不赘述,pytest框架相较于unittest的一大优势就在于拥有用例失败 ...