爬虫

python的爬虫操作

一、request

一会写

二、xpath

xpath中 [1] 就是第一个元素

代码 含义
//a 当前html页面中所有的a标签
//a/@href 当前html页面中所有的a标签href属性(链接)的内容
//a/text() 当前html页面中所有的a标签de文本内容
//img/@src 所有的img标签中src内容
//img[@alt=’—‘]/@src 所有的img标签中alt属性为—的src内容
//div[@class=’lst-item’][3]/a[last()]/img/@src a选取页面中所有div标签下class为lst-item的第三个中最后一个a标签img标签中的src
  1. //a

    当前html页面中所有的a标签

  2. //a/@href

    当前html页面中所有的a标签href属性(链接)的内容

  3. //a/text()

    当前html页面中所有的a标签de文本内容

  4. //img/@src

    所有的img标签中src内容

  5. //img[@alt=’—‘]/@src

    所有的img标签中alt属性为—的src内容

  6. //div[@class=’lst-item’][3]/a[last()]/img/@src
    a选取页面中所有div标签下class为lst-item的第三个中最后一个a标签img标签中的src

  7. text()

    文字

  8. //a[contains(text(),’下一页’)]/@href

    下一页地址

1
2
3
4
5
6
7
8
9
10
11
12
13
from lxml import etree
import requests

url = "-----"
hesders = {
"User-Agent":"------"
}
response = requests.get(url=url,headers=headers)
html_doc = response.content.decode("utf-8")
#用etree去转化html_doc,转化为一个html对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)

xxx = html.xpath("xpath 语法")

Tips:

不太会怎么办,那就直接去浏览器里的开发者模式复制xpath路径

三、selenium

基本操作代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from selenium import webdriver
import requests
#键盘按键包
from selenium.webdriver.common.keys import Keys
#鼠标键盘包
from selenium.webdriver.common.action_chains import ActionChains

#指定调用某个地方的chrome
options = webdriver.ChromeOptions() #可更换不同的浏览器驱动

#chrome浏览器主程序的位置
location = r"文件路径"

#在options增加读取位置
options.binary_location = location

#使用静默模式
#options.add_argument("headless")
#加代理http https socks4 socks5
#options.add_argument('--proxy-server=%s'%'socks4://1.2.3.4:54321')
#更改浏览器语言
#options = add_argument("--lang=en-US")
driver = webdriver.Chrome("webdriver地址路径",options=options)

#设置手机型号,可不填为默认
#mobileEmulation = {"devicename":"手机型号"}
#使用某个手机型号浏览
#options.add_experiment_option(mobileEmulation',moblieEmulation)

#使用get的方法打开一个网站
driver.get("域名") #打开chrome浏览器并打卡某个域名
driver.refresh() #刷新网页
driver.quit() #关闭进程

#根据id找到对应的目标,并发送(输入)文字
driver.find_element_by_id("id名").send_keys("内容")
#组合键输入
#driver.find_element_by_id("id名").send_keys(keys.CONRTOL,'a')

#根据xpath找到目标,并点击
driver.find_element_by_xpath("xpath语法").click()

#获取当前页面地址(尚未切换标签)
print(driver.current_url)

#获取当前页面源码
print(driver.page_source)

#获取当前页面cookie
print(driver.get_cookie)

新版本selenium中,find_element语法有所变化

1
2
3
4
from selenium.webdriver.common.by import By
# 先导入一下包

driver.find_element(By.XPATH,"Xpath路径")
1
2
3
4
5
6
7
#鼠标键盘包
from selenium.webdriver.common.action_chains import ActionChains

#定义一个移动并点击鼠标动作
action = ActionChains(driver).move_by_offset(70,120).click()
#开始执行
action.perform()

实现拖拽操作

action = ActionChain(driver)

action.drag_and drop(first_tar,second_tar)

#从第一个位置拖拽到第二个位置

鼠标点击像素操作

ActionChain(driver).move_by_offset(200,300).click().perform()

ActionChain(driver).move_by_offset(-200,300).perform() #把鼠标移动回来

鼠标其他操作

click() 单击鼠标左键

click_and_hold() 点击鼠标左键不放开

double_click() 双击鼠标左键

context_click() 单击鼠标右键

drag_and_drop_by_offset(first_tar,second_tar) 拖拽到某个位置松开

key_down(“—“) 按下一个键

move_to_element(ele) 移动到某个元素的位置

move_to_element_by_offset(ele,x,y) 移动到某个元素的相对位置

1.下拉框操作:

#先引入一个包

from selenium.webdriver.support.ui import Select

#使用Select包裹起来的xpath值找到下拉框元素

select1 = Select(driver.find_element_by_xpath(“//select[@class=’—‘]”))

#选择下拉框的值

select1.select_by_value(“—“)

2.新建标签页:

js = window.open(“baidu.com”)

driver.execut_script(js)

3.查看当前页面:

print(driver.current_url)

4.切换选项卡

driver.switch_to.window(driver.window_handles[1]) #切换到第二个标签页

5.弹窗处理:

driver.switch_to_alert.accept()

6.iframe处理:

#找到并进入iframe标签

ifra_div = driver.find_element_by_tag_name(“iframe”) #如果有多个iframe,就用elements

driver.switch_to.frame(ifra_div) #用[–]选取不同的iframe标签

#释放iframe,回到主页面

driver.switch_to_default_content()

7.获取标签下的文字:

get_attribute(‘innerText’)


8.cookie操作:

#查看cookie

cookie = driver.get_cookies()

print(cookie)

#增加cookie

driver.add_cookies({—})

#清除所有cookie

driver.delete_all_cookies()

9.滑动操作:

js = “document.documentElement.scrollTop=10000”

driver.execute_script(js)

10.截图操作:

#页面直接截图

driver.get_screenshot_as_file(“./picture.jpg”)

#base64加密截图

b = driver.get_screenshot_as_base64

print(b)

11.浏览器处理:

driver.back() 后退

driver.refresh() 刷新

driver.forword() 前进

12.最大化窗口:

driver.maximize_window()


13.超时操作:

#引入3个包

1
2
3
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

#如果10s页面还没加载出来,就抛出一个异常,需要配合try来做

driver.set_pageload_timeout (10)

#隐性等待,全局查找页面元素的等待时间,如果这个时间没找到指定元素,就抛出异常(全局做一次就好)

driver.implicitly_wait(2)

#显性等待

使用频率最高的元素超时设置

WebDriverWait(driver,10).until(EC.presence_of_element_located(By.ID,’j-anime-nav’))

uti1用来检测指定的元素是否出现,如果在超时的时间内出现就返回选择器的信息,否则报TimeOutException

until_not用来检测指定的元素是否消失,如果在超时时间内消失返回True,否则报TimeOutException

有关selenium的三种等待——CSDN

14.反反selenium:

#某些网站会识别selenium

options.add_experimental_option(‘excludeswitches’,[‘enable-automation’])

15.图片不加载:

适用于只爬文字的爬虫,降低流量消耗,加快速度

1
2
3
4
5
6
prefs = {
'profile.default_content_setting_values':{
'images':2
}
}
options.add_experimental_option ('prefs',prefs)

爬虫
http://example.com/2023/12/01/爬虫/
Author
w1t2f3
Posted on
December 1, 2023
Licensed under