总结
一. selenium设置选项
from selenium import webdriver
# from selenium.webdriver import ChromeOptions
url = 'https://www.jd.com'
# 1.创建设置选项
options = webdriver.ChromeOptions()
# 2.添加选项参数
# 1) 取消测试环境
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 2) 取消图片加载(提高爬虫效率)
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
b = webdriver.Chrome(options=options)
b.get(url)
print(b.page_source)
二. frame切换
from selenium import webdriver
url = 'https://mail.163.com/'
b = webdriver.Chrome()
b.get(url)
"""
有的时候会遇到这样的网页:一个网页对应的html标签嵌套了其他的html标签
(前端如果要实现嵌套的功能必须要将被嵌套的html放在iframe标签中),
如果需要爬取网页内容在嵌套的html里面,需要先让浏览器选中内容嵌套的html。
(浏览器对象默认选中的是最外面的html标签)
"""
# 1. 获取提供html标签的iframe标签
box = b.find_element_by_css_selector('#loginDiv>iframe')
# 2.切换frame
b.switch_to.frame(box)
print(b.page_source)
三. 多线程技术
import time
from datetime import datetime
from threading import Thread
# Thread类 - 线程类 Thread类的对象 - 子线程
def download(name):
print(f'{name}开始下载:{datetime.now()}')
time.sleep(2)
print(f'{name}下载结束:{datetime.now()}')
# 1.在一个线程(主线程)中下载三个电影:消耗时间是6秒
# download('肖申克的救赎')
# download('霸王别姬')
# download('阿甘正传')
# 2.在三个子线程中分别下载三个电影
# 1)创建线程对象
t1 = Thread(target=download, args=('肖申克的救赎',))
t2 = Thread(target=download, args=('霸王别姬',))
t3 = Thread(target=download, args=('阿甘正传',))
# 2)启动线程
t1.start()
t2.start()
t3.start()
作业
"""
Time:2021/6/1 18:58
Author:Second
"""
import requests
from lxml import etree
from selenium import webdriver
from datetime import datetime
from threading import Thread
def get_net_data(url):
b = webdriver.Chrome()
b.get(url)
data = b.page_source
html = etree.HTML(data)
lis = html.xpath('//*[@id="rank-view-list"]/div/ul/li')
list1 = []
for li in lis:
book = li.xpath('div[2]/h4/a/text()')[0]
author = li.xpath('div[2]/p[1]/a[1]/text()')[0]
list1.append([book, author])
print(list1)
return list1
t = []
for x in range(5):
t.append(Thread(target=get_net_data, args=(f'https://www.qidian.com/rank/collect?chn=21&page={x+1}',)))
for x in t:
x.start()