爬虫解析库使用

  1. Xpath
表达式描述
nodename选中该元素
/从当前节点选取直接的子节点
//选择文档中的节点,不考虑他们的位置
.选取当前节点
选取当前节点的父节点
text()选取文本
last()选取最后一个节点
//li[@class=‘xx’]选取符合条件的节点
from lxml import etree
import requests

res = requests.get("http://xxxxxxx")
html = etree.HTML(res.content)
result = html.xpath("//li/a/@href)

如果某个属性有多个值得话,可以输用contains()函数选取,第一个参数传入属性名,第二个参数传入属性包含的属性值,就可以匹配到了

from lxml import etree

text = "<li class="li li-first”><a href=” link html first item</a></li> "
res = etree.HTML(text)
result = res.xpath(//li[contains(@class, "li")/a/text()])
  1. Beautiful Soup
from bs4 import BeautifulSoup as bs

text = "<p class="one">文本</p>"

# 创建BeautifulSoup对象
soup = bs(text, "lxml")			# 第二个参数是选择用哪个解析器,这里使用lxml
print(soup.p.string)
print(soup.p.attrs)			# 打印第一个p标签所有的属性,是一个字典类型
print(soup.p["class"])			# 也可以直接打印p标签的某个属性

在定义文本的时候,只有一个p标签,对于不标准的HTML字符串,在初始化BeautifulSoup对象的时候会自动补全更正格式,然后调用soup.p.string,输出p节点的文本内容,soup.p可以选出HTML中的p节点,在调用string属性就可以得到文本内容(这种选择方式只会选择匹配到的第一个节点,后面的都会忽略)

from bs4 import BeautifulSoup as bs

soup = bs(html, "lxml")

print(soup.ul.contents)
print(soup.p.children)

contents属性返回UL标签的所有节点,结果是列表形式,会将UL标签中所有的内容以列表形式返回
chiildren属性也可以得到同样的结果,是生成器类型,使用for循环输出即可

如果要得到所有的子孙节点的话,可以调用descendants属性,返回结果是生成器类型,之后用for循环输出

print(soup.p.descendants)

find_all查询所有符合条件的元素:find_all(name, attrs, recursive, text, **kwargs)
根据节点名查找和根据属性值查找

soup = BeautifulSoup(html, "lxml")
for ul in soup.find_all(name="ul"):
	for li in ul.find_all(name="li"):
		for a in li.find_all(name="a", attrs={class": "xxx"}):
			print(a.string)

传入name参数,值为ul,就是查询ul节点,返回结果是列表类型每个元素是bs.element.Tag类型,在进行嵌套查询,查询其内部的li节点,之后继续查询li中的所有a节点。在查询a节点的时候,加入了attrs参数,他的值是a标签的某个属性,是一个字典类型,可以用来确定定位到这个a,得到的结果也是列表

CSS选择器使用时,调用select()方法传入相应的CSS选择器即可
soup = bs(html, "lxml")
result = soup.select("ul li a.xxx")		# CSS选择器查找ul下的li下的class为xxx的a标签
  1. Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,一个简单的Selenium的使用
from selenium import webdriver
from selenium.webdriver.comon.keys import Keys
import time

driver = webdriver.Chrome()		# 声明浏览器对象
driver.get("https://www.baidu.com")		# 利用对象打开网址
input = driver.find_element_by_id("kw")			# 查找id为kw的元素
input.send_keys("python")
input.send_keys(Keys.ENTER)				# 输入python后回车
print(driver.page_source)		# 打印操作之后的网页源代码
time.sleep(7)
driver.close()				# 等待7秒之后关闭窗口

selenium定位节点

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
input_first = driver.find_element_by_id("q")		# 查找id为q的那个节点
input_second = driver.find_element_by_css_selector("#q)		# 根据css选择器查找
input_last = driver.find_element_by_xpath("//*[@id='q']")		# 根据xpath查找

如果查找的目标在网页中只有一个,那么就可以使用find_element…()方法。如果有多个节点,那么用find_element…()就只能得到第一个节点了。如果要查找多个节点需要用find_elements…()方法,多了一个s

选取京东左侧导航栏的标题和链接

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.jd.com/")			# 用浏览器驱动对象请求京东首页

li_list = driver.find_elements_by_css_selector(".JS_navCtn.cate_menu li")	# 用css选择器查找这个类下的所有li节点
for li in li_list:
	for a in li.find_elements_by_css_by_tag_name("a")		# 再查找li下的所有a节点
		print(a.text, ":", a.get_attribute("href"))		# 打印出当前a节点的内容和获取的属性href

selenium驱动浏览器执行操作,常用的模拟操作有:输入文字时用send_keys()。清空文字用clear(), 点击按钮用click()
driver =webdriver.Chrome()
driver.get("https://www.baidu.com")
put = find_element_by_id("kw")			# 查找输入框的id
search = find_element_by_id("su")			# 查找"百度一下"的id
put.send_keys("python")			# 输入框节点输入文字
put.clear()			# 清空输入
put.send_keys("spider")				# 再次输入 
search.click()			# 点击搜索

当网页中有一种节点叫iframe,也就是网页的子页面Frame,Selenium打开网页之后实在父级Frame中,他是不能获取到子Frame里面的节点的,需要使用 switch_to.frame()方法来还到子Frame中,括号中填写frame的id值
driver = webdriver.Chrome()
driver.get("https://mail.qq.com/cgi-bin/loginpage?autologin=n&errtype=1")
driver.switch_to.frame("login_frame")		# 请求页面之后使用switch_to.frame切换到子页面
user = driver.find_element_by_id("u")		# 查找id为u的节点
pas = driver.find_element_by_id("p")		# id为p
login = driver.find_element_by_id("login_button")		# id为登陆的
user.send_keys("123456789")			# 输入账号
pas.send_keys("xxxxxx")			# 输入密码
login.click()			# 点击登陆

selenium控制前进和后退
driver.get("https://www.baidu.com")
driver.get("https://www.taobao.com")
driver.get("https://mail.qq.com/cgi-bin/loginpage?autologin=n&errtype=1")

driver.back()			# 使用back()控制后退
driver.back()
time.sleep(1)
driver.forward()			# 使用forward()前进

操作Cookies
driver.get("https://www.zhihu.com/explore")
print(driver.get_cookies())			# 打印所有Cookies
driver.add_cookies({'name': 'leeee', 'value': 'pig'})			# 添加一条Cookies
print(driver.get_cookies())			# 打印就会发现多了一项新加的Cookies
driver.delete_all_cookies()			# 删除所有Cookies
print(driver.get_cookies())			 # 为空

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值