为什么要使用Selenium呢?
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。随后我们就可以获取测试的网页相关信息。
该项目主页
http://www.openqa.org/selenium/
python -m pip install selenium安装即可,
然后安装chromedriver.exe
然后将chromedriver.exe放置在谷歌浏览器的目录下,将目录加到环境变量。
一般来说chromedriver.exe的路径是下面这个
path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
Selenium使用流程
- 启动一个Selenium
- 搜索关键字
- 分析网页并翻页
- 分析提取商品信息
启动一个Selenium
首先还是先看文档,怎么启动一个Selenium。
官方文档http://selenium-python.readthedocs.io/waits.html
由于我们请求网页肯定是要等待网页完全加载ok才能进行下一步,我们查看一下5.wait这一部分。
这个示例我们就可以直接拿来使用。
由于笔者使用的Chrome浏览器,所以需要修改:
driver = webdriver.Chrome()
我们修改url试着请求淘宝首页试试。
driver.get("https://www.taobao.com/")
运行即可进入淘宝首页。
搜索关键字
接下来我们在输入框中输入美食:
查看文档怎么输入内容。
我们可以根据输入框的CSS属性、ID或者XPATH等 获取到这个输入框,然后让他输入“美食”,然后点击搜索。
上面是描述以及,按钮点击的小例子。
我们下面来实现它。
右键选择这个标签可以直接获取属性。例如CSS和XPATH或者查看ID。
browsr = webdriver.Chrome()
wait = WebDriverWait(browsr, 10)
def search():
# 请求首页
browsr.get('https://www.taobao.com')
# 判断加载是否成功
# http://selenium-python.readthedocs.io/waits.html
try:
#延时相关操作
input = wait.until(
# 注意使用CSS选择器
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
#查看官方文档
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
#输入框输入 美食
input.send_keys('美食')
#点击确认按钮
submit.click()
finally:
browsr.quit()
if __name__ == '__main__':
search()
运行发现自动开启浏览器,进入淘宝首页,输入美食,点击搜索。
分析网页并翻页
有个提问,假如网速比较慢,请求容易超时,我们可以选择再次请求。
#接上部分代码
except TimeoutException:
return search() #重新请求
首先获取总页数
#这个标签长这样 我们需要获取数字即可
<div class="total">
共 100 页,
</div>
totle = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
)
#wait容易引发timeout
return totle.text #然后将页数返回
#定义一个main函数 作为最终调用
def main():
total = search()
total = int(re.compile('(\d+)').search(total).group(1))
#只需要获取关键的数字
print(total)
我们现在需要获取,当前的页数,以及翻到哪一页了,这两者匹配才可以。
def next_page(page_number):
try:
# 延时相关操作
input = wait.until(
# 注意 #和字符串之间没有 空格
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")) # 使用css选择器 因为是class所以是#q 这是查看淘宝搜索框得到的
)
# 查看官方文档
submit = wait.until(
# 注意 #和字符串之间没有 空格
EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
)
input.clear()
input.send_keys(page_number) #现在就是翻页
submit.click()
#判断高亮位置数字
wait.until(
# 注意 #和字符串之间没有 空格
EC.text_to_be_present_in_element((By.CSS_SELECTOR,
"#mainsrp-pager > div > div > div > ul > li.item.active > span"),
str(page_number))
# 使用css选择器
)
except TimeoutException:
next_page(page_number)
分析提取商品信息
导入from pyquery import PyQuery as pq
#解析网页
def get_products():
#先判断是否加载完毕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items item'))
)
html = browsr.page_source #获取网页源码
doc = pq(html)#解析
#获取所有选择内容
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
product = {
#find 选择器 img这个标签下的
'image' : item.find('.pic .img').attr('data-src'), #src属性
#'title' : item.find('.row .H').text(),
'title': item.find('.J_ClickStat').text(),
'sell' : item.find('.deal-cnt').text(),
'price': item.find('.price').text(),
'localtion':item.find('.location').text(),
'shop' : item.find('.shop').text()
}
print(product)
这个应该很容易理解,纯粹获取Item内容。
多种方式都可以获取到内容!
以上就是Selenium的简单使用。