案例:爬取糗事百科
爬点笑话开心开心。。。
import requests,csv,threading,queue
from lxml import etree
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','Referer': 'https://www.qiushibaike.com/text/'}
class Producer(threading.Thread):
def __init__(self,data_queue,save_queue):
self.data_queue = data_queue
self.save_queue = save_queue
super().__init__()
def run(self):
while not self.data_queue.empty():
url = self.data_queue.get()
resp = requests.get(url,headers=headers)
text = resp.content.decode()
html = etree.HTML(text)
data = html.xpath('/html/body/div[2]/div/div[2]/div[1]/a/div/span/text()|//div[@class="article block untagged mb15 typs_hot"]/a[1]/div/span/text()')
for each in data:
each = each+'\n'
self.save_queue.put(each)
class Consumer(threading.Thread):
def __init__(self,save_queue):
self.save_queue = save_queue
super().__init__()
def run(self):
with open('hhh.txt','a',encoding='utf-8') as f:
while not self.save_queue.empty():
f.write(self.save_queue.get(block=False))
def main():
data_queue = queue.Queue(100)
save_queue = queue.Queue(1000)
for i in range(1,5):
url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)
data_queue.put(url)
for x in range(5):
th = Producer(data_queue,save_queue)
th.start()
for x in range(5):
th = Consumer(save_queue)
th.start()
if __name__ == '__main__':
main()
Selenium的基本使用-操作表单元素
表单元素:输入框,按钮啊,下次自动登录啊这类的。。详细的百度吧。。。
-
操作输入框:找到这个元素,然后使用send_keys( value),将数据填进去。
-
操作checkbox:因为要选中checkbox标签,在网页中是通过鼠标点击的,因此想要选中checkbox标签,先选中这个标签,在执行click。
a=driver.find_element_by_name('button;) a.click
checkbox就是那种下次自动登录这类的按钮。。 -
选择select:select元素不能直接点击。因为点击后还要选中元素,使用类
selenium.webdriver.support.ui.Select
,将获取到的元素当成参数传到这个类中,创建这个类的对象,以后就可以使用这个对象进行选择了。。。。。。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/signin?next=%2F') # 知乎登录界面
username = driver.find_element_by_name('username')
username.send_keys('哈哈哈哈哈哈哈哈哈哈哈') # 自动输入账号
password = driver.find_element_by_name('digits')
password.send_keys('哈哈哈哈哈哈') # 自动输入验证码
butten = driver.find_element_by_class_name('SignFlow-submitButton')
butten.click() # 点击登录按钮
# 豆瓣网站相关的测试代码,主要用来验证checkbox的:
# 在原网页是找不到remember这个按钮的,他在iframe标签下,整个登录框是另一个网页加载进来的。。。网页就是跟在后面那个
driver.get("https://accounts.douban.com/passport/login_popup?login_source=anony")
checkbox = driver.find_element_by_name("remember")
checkbox.click()
# 南昌航空大学测试代码,主要用来验证select的:
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
driver.get("http://www.nchu.edu.cn/")
select = Select(driver.find_element(By.ID,"ContentPlaceHolder1_dpLinkList")) # 这个效果跟by_id一样,就是需要格外导入
# 要经过Select 包装的啊,,,,
select.select_by_index(1) # 通过索引值来选择第二个链接
select.select_by_value("http://secp.jxedu.gov.cn/portal/index") # 通过值来跳转
select.select_by_visible_text("东航优惠机票1") # 通过可见文本来选择
基本使用-行为链
有时候在页面的操作可能要很多步,那么这时候可以使用鼠标行为链类。。
selenium.webdriver.common.action_chains.ActionChains
比如将鼠标移动到某个元素进行点击,,,,
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/signin?next=%2F") # 又是知乎。。。
actions = ActionChains(driver) # 注意包装
usernameTag = driver.find_element_by_name("username") # 获取相关元素,账号,验证码输入框,和登录按钮
digitsTag = driver.find_element_by_name("digits")
submitBtn = driver.find_element_by_class_name("SignFlow-submitButton")
actions.move_to_element(usernameTag) # 移动鼠标到账号框
actions.send_keys_to_element(usernameTag,"哈哈哈哈哈") # 输入账号
actions.move_to_element(digitsTag)
actions.send_keys_to_element(digitsTag,"6666666")
actions.move_to_element(submitBtn)
actions.click(submitBtn) # 点击登录按钮
actions.perform() # 让行为链执行。。。真成精了。。。。
更能模仿人的行为,防止被网站干掉。。。
- click(on_element=None) ——单击鼠标左键
- click_and_hold(on_element=None) ——点击鼠标左键,不松开
- context_click(on_element=None) ——点击鼠标右键
- double_click(on_element=None) ——双击鼠标左键
- drag_and_drop(source, target) ——拖拽到某个元素然后松开
- drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
- key_down(value, element=None) ——按下某个键盘上的键
- key_up(value, element=None) ——松开某个键
- move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
- move_to_element(to_element) ——鼠标移动到某个元素
- move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
- perform() ——执行链中的所有动作
- release(on_element=None) ——在某个元素位置松开鼠标左键
- send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
- send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
更多方法参考脑部链接。。。。你不会想看的。。。。。
键盘操作
selenium.webdriver.common.keys.Keys
selenium提供一个keys包来模拟所有的按键操作,下面是一些常用的按键操作 ,有时候使用键盘操作可以省去很多步骤:
- 回车键:Keys.ENTER
- 删除键:Keys.BACK_SPACE
- 空格键:Keys.SPACE
- 制表键:Keys.TAB
- 回退键:Keys.ESCAPE
- 刷新键:Keys.F5
- 全选(ctrl+A):send_keys(Keys.CONTROL,‘a’) #组合键需要用send_keys方法操作
- 复制(ctrl+C):send_keys(Keys.CONTROL,‘c’)
- 剪切(ctrl+X):send_keys(Keys.CONTROL,‘x’)
- 粘贴(ctrl+V):send_keys(Keys.CONTROL,‘v’)
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
driver.get('https://pypi.org/')
element=driver.find_element_by_id('search') #获取输入框
element.send_keys('selenium') #搜索selenium包
element.send_keys(Keys.ENTER) #按回车键
element_a = driver.find_element_by_xpath('//*[@id="content"]/section/div/div[2]/form/section[2]/ul/li[1]/a/h3/span[1]')#定位selenium包链接
ActionChains(driver).move_to_element(element_a).click(element_a).perform() #按左键点击链接执行
element_down=driver.find_element_by_link_text('Download files') #定位下载链接
ActionChains(driver).move_to_element(element_down).click(element_down).perform() #按左键点击链接
element_selenium=driver.find_element_by_link_text('selenium-3.13.0.tar.gz') #定位元素selenium下载包链接
data=element_selenium.get_attribute('href') #获取链接地址
with open('selenium-3.13.0.tar.gz','wb') as f:
source=requests.get(data).content #请求下载链接地址获取二进制包数据
f.write(source) #写入数据
f.close()
driver.quit()