爬虫 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 属性所对应的内容为应 ...
随机推荐
- [PHP] 解决php中上传大文件的错误
修改nginx配置文件,下面这个参数client_max_body_size 110M; 修改php配置文件中下面两个参数在php.ini中找到下面两个配置,配置项给改大,如果找不到php.ini的位 ...
- jira问题更改项目
1.点击“问题”在问题中,筛选你要修改的问题,以下是以创建用户为搜索条件,然后点击“工具”---移动所有问题 2.选择要移动的问题,选择项目,进行移动
- go语言设计模式之interpreter
interpreter.go package interpreter import ( //"fmt" "strconv" "strings" ...
- Day13- Python基础13 生产者与消费者模型,进程
本节内容: 1:生产者与消费者 2:进程调用两种 3:进程Process的方法 4:进程间的通信1 queue 队列 5:进程间的通信2 Pipe 管道 6:进程间的数据共享 Managers 7:进 ...
- nginx学习(二):nginx显示默认首页解析过程
本篇文章分析下nginx 显示默认首页的过程 如下图所示 查看config文件: # 如果忘记nginx 安装目录.使用下面命令查看 [root@XXX]# whereis nginx nginx: ...
- plsql查询数据显示为乱码解决方案
1.首先安装plsql之后连接数据库,发现使用sql查询出来的中文数据是??,即乱码.原因,因为数据库的编码与本地的编码不一致,plsql默认加载的是本机win10的编码. 2.解决办法: 参数如下: ...
- thinkphp5.1单模块设置
thinkphp5.1单模块 1. // 是否支持多模块'app_multi_module' => false, // 自动搜索控制器'controller_auto_search' => ...
- 详解JAVA8函数式接口{全}
1: 函数式接口 1.1 概念 1.2 格式 1.3@FunctionalInterface注解 1.4 调用自定义函数接口 2:函数式编程 2.1:lambda的延迟执行 2.2 使用Lambda作 ...
- 常用的app包名和类名
应用 包名 启动类 QQ com.tencent.mobileqq com.tencent.mobileqq.activity.HomeActivity 微信 com.tencent.mm com.t ...
- H5混合应用之webview元素定位工具
一.工具选择 webview元素定位有三种方式: 使用driver.page_source方法,将获取到的页面内容写入到一个html文件中,然后使用浏览器打开html文件,使用F12调试用具进行元素定 ...