爬虫 xpath 获取方式
回顾 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进行获取数据
- #项目需求:解析58二手房的相关数据
- import requests
- from lxml import etree
- url = 'https://bj.58.com/shahe/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d30000c-0047-e4e6-f587-683307ca570e&ClickID=1'
- headers = {
- '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'
- }
- page_text = requests.get(url=url,headers=headers).text
- tree = etree.HTML(page_text)
- li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')
- fp = open('58.csv','w',encoding='utf-8')
- for li in li_list:
- title = li.xpath('./div[2]/h2/a/text()')[0]
- price = li.xpath('./div[3]//text()')
- price = ''.join(price)
- fp.write(title+":"+price+'\n')
- fp.close()
- print('over')
- #调用xpath 返回的是一个列表结构,使用索引
利用xpath处理中文乱码
- # ctrl+shift+x
- # - 解析图片数据:http://pic.netbian.com/4kmeinv/
- import requests
- from lxml import etree
- import os
- import urllib
- url = 'http://pic.netbian.com/4kmeinv/'
- headers = {
- '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'
- }
- response = requests.get(url=url,headers=headers)
- #response.encoding = 'utf-8'
- if not os.path.exists('./imgs'):
- os.mkdir('./imgs')
- page_text = response.text
- tree = etree.HTML(page_text)
- li_list = tree.xpath('//div[@class="slist"]/ul/li')
- for li in li_list:
- img_name = li.xpath('./a/b/text()')[0]
- #处理中文乱码
- img_name = img_name.encode('iso-8859-1').decode('gbk')
- img_url = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
- img_path = './imgs/'+img_name+'.jpg'
- urllib.request.urlretrieve(url=img_url,filename=img_path)
- print(img_path,'下载成功!')
- print('over!!!')
- #通过encode('iso-8859-1').decode('gbk')编译
#或使用response.encoding = 'utf-8'
xpath在遇到加密base64时解决加密a标签
- #【重点】下载煎蛋网中的图片数据:http://jandan.net/ooxx
- #数据加密 (反爬机制)
- import requests
- from lxml import etree
- import base64
- import urllib
- headers = {
- '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'
- }
- url = 'http://jandan.net/ooxx'
- page_text = requests.get(url=url,headers=headers).text
- tree = etree.HTML(page_text)
- img_hash_list = tree.xpath('//span[@class="img-hash"]/text()')
- for img_hash in img_hash_list:
- img_url = 'http:'+base64.b64decode(img_hash).decode()
- img_name = img_url.split('/')[-1]
- urllib.request.urlretrieve(url=img_url,filename=img_name)
xpath获取两次a标签进行获取及分页判断
- #爬取站长素材中的简历模板
- import requests
- import random
- from lxml import etree
- headers = {
- 'Connection':'close', #当请求成功后,马上断开该次请求(及时释放请求池中的资源)
- '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'
- }
- url = 'http://sc.chinaz.com/jianli/free_%d.html'
- for page in range(1,4):
- if page == 1:
- new_url = 'http://sc.chinaz.com/jianli/free.html'
- else:
- new_url = format(url%page)
- response = requests.get(url=new_url,headers=headers)
- response.encoding = 'utf-8'
- page_text = response.text
- tree = etree.HTML(page_text)
- div_list = tree.xpath('//div[@id="container"]/div')
- for div in div_list:
- detail_url = div.xpath('./a/@href')[0]
- name = div.xpath('./a/img/@alt')[0]
- detail_page = requests.get(url=detail_url,headers=headers).text
- tree = etree.HTML(detail_page)
- download_list = tree.xpath('//div[@class="clearfix mt20 downlist"]/ul/li/a/@href')
- download_url = random.choice(download_list)
- data = requests.get(url=download_url,headers=headers).content
- fileName = name+'.rar'
- with open(fileName,'wb') as fp:
- fp.write(data)
- print(fileName,'下载成功')
- //*[@id="down"]/div[2]/ul/li[6]/a
xpath 利用 | 实现并集获取数据
- #解析所有的城市名称
- import requests
- from lxml import etree
- headers = {
- 'Connection':'close', #当请求成功后,马上断开该次请求(及时释放请求池中的资源)
- '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'
- }
- url = 'https://www.aqistudy.cn/historydata/'
- page_text = requests.get(url=url,headers=headers).text
- tree = etree.HTML(page_text)
- li_list = tree.xpath('//div[@class="bottom"]/ul/li | //div[@class="bottom"]/ul/div[2]/li')
- for li in li_list:
- city_name = li.xpath('./a/text()')[0]
- print(city_name)
proxies 代理设置
- #设置请求的代理ip: www.goubanjia.com 快代理 西祠代理
- #代理ip的类型必须和请求url的协议头保持一致
- url = 'https://www.baidu.com/s?wd=ip'
- page_text = requests.get(url=url,headers=headers,proxies={'https':'61.7.170.240:8080'}).text
- with open('./ip.html','w',encoding='utf-8') as fp:
- fp.write(page_text)
防卫机制:
robots
UA
数据加密
懒加载
代理ip
爬虫 xpath 获取方式的更多相关文章
- Scrapy:运行爬虫程序的方式
Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...
- 放养的小爬虫--京东定向爬虫(AJAX获取价格数据)
放养的小爬虫--京东定向爬虫(AJAX获取价格数据) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wang/Sp ...
- Appium根据xpath获取控件
如文章< Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通 ...
- Appium依据xpath获取控件实例随笔
如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.当中一种就是依据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...
- 【转】Appium根据xpath获取控件实例随笔
原文地址:http://blog.csdn.net/zhubaitian/article/details/39754233 如文章<Appium基于安卓的各种FindElement的控件定位方法 ...
- Appium根据xpath获取控件实例随笔
如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
- 爬虫, 获取登录者的外网IP
笔者学习了一下用爬虫, 获取登录者的外网IP. 首先导入Jsoup的jar包 public class RetrivePage { private static String url="ht ...
- [转]Android SHA1与Package获取方式
转自高德地图LBS Android SHA1与Package获取方式 获取应用包名 打开Android 应用工程的 AndroidManifest.xml配置文件,package 属性所对应的内容为应 ...
随机推荐
- 【Https异常】This request has been blocked; the content must be served over HTTPS
一.问题出现场景 项目从http升级到https后,jsp页面存在发送http请求的情况下就会出现该异常.因为HTTPS 是 HTTP over Secure Socket Layer,以安全为目标的 ...
- Java学习笔记(6)---正则表达式,方法
1.正则表达式: a.定义: 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 在Java,一个字符串其实就是一 ...
- 手工挖掘web常见漏洞时的一些经验总结
一.前提: 漏洞挖掘原则 所有变量 所有头 cookie中的变量 逐个变量删除 漏洞的本质 数据与指令的混淆 对用户输入信息过滤不严判断失误,误将数据当指令 二.经典漏洞: 1.身份认证 常用弱口令/ ...
- acwing 651. 逛画展
地址 https://www.acwing.com/problem/content/653/ 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那 ...
- WPF 精修篇 样式继承
原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...
- <Graph> Topological + Undirected Graph 310 Union Find 261 + 323 + (hard)305
310. Minimum Height Trees queue: degree为1的顶点 degree[ i ] : 和 i 顶点关联的边数. 先添加整个图,然后BFS删除每一层degree为1的节 ...
- IT兄弟连 Java语法教程 数组 深入数组 内存中的数组
数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的.下面将深入介绍数组在内存中的运行机制. 内存中的数组 数组引用变量只是一个引用,这个引用变量可以指向任何有效的 ...
- pytorch_模型参数-保存,加载,打印
1.保存模型参数(gen-我自己的模型名字) torch.save(self.gen.state_dict(), os.path.join(self.gen_save_path, 'gen_%d.pt ...
- 09-Django静态文件
1.静态文件 项目中的图片.CSS.js都是静态文件,一般会将静态文件放到一个单独的目录下,也方便管理.一般会将静态文件放到一个单独的目录下,也可以放在应用的目录下,由于静态文件是全部应用都在使用的, ...
- pytest框架之rerunfailures失败重运行机制
web自动化测试中,稳定性在整个测试运行中都至关重要,但不能保证测试脚本或者测试环境一直都能够稳定,它牵扯到诸多因素,在这里就不赘述,pytest框架相较于unittest的一大优势就在于拥有用例失败 ...