最近看崔庆才老哥的python爬虫视频感觉受益良多,很多知识点被他讲的很清楚有条理,基本上他一集视频够我消化个好几天
好几天没写原创了,附上代码,顺便写写我这两天的学习日志吧
短短百行代码,我学习了两天
第一天看了视频,学了下selenuim的基本用法
首先安装selenium模块:
pip3 install selenium 这里我安装的是3.14版本的
其次还需要安装Chromedriver(切记这里要安装与自己chrome对应的版本,我的chrome是66,所以安装的是2.40)
下载地址
#encoding=utf-8
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
# 打开谷歌浏览器
try:
browser.get('http://naotu.baidu.com/file/732bcef91efa1375210d15c7f38cadb7')
# 打开百度这个网站
input = browser.find_element_by_id('kw')
# 找到kw这个元素
input.send_keys('Python')
# 敲入python
input.send_keys(Keys.ENTER)
# 敲入回车
wait = WebDriverWait(browser, 10)
# 等待
wait.until(EC.presence_of_element_located((By.ID, 'content_left')))
# 等待元素被加载出来
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
finally:
browser.close()
这样就完成了一个简单的敲击百度搜索的事件
from selenium.webdriver import ActionChains
from selenium import webdriver
import time
browser = webdriver.Chrome()
action = ActionChains(browser)
browser.get('https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.754894437.1.5af911d9XiIwcB&f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F')
browser.find_element_by_xpath('//*[@id="J_Quick2Static"]').click()
browser.find_element_by_xpath('//*[@id="TPL_username_1"]').send_keys('*************')
browser.find_element_by_xpath('//*[@id="TPL_password_1"]').send_keys('*************')
source=browser.find_element_by_xpath("//*[@id='nc_1_n1t']")#需要滑动的元素
def VerificationCode(source):
action.click_and_hold(source).perform() #鼠标左键按下不放
action.move_by_offset(298,0)#需要滑动的坐标
action.release().perform() #释放鼠标
time.sleep(0.1)
VerificationCode(source)
#输入账号密码
browser.find_element_by_xpath('//*[@id="J_SubmitStatic"]').click()
python第三方模块基本没有不能实现的,只有你想不到没有他做不到的
简单的几行代码可以完成拖拽滑动验证码的事件
其实滑动验证的另一种解决方法就是用cookie登陆
# coding=utf-8
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import re
from pyquery import PyQuery as pq
import pymongo
from config import *
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=chrome_options)
#这段代码定义了headless chrome,所有的配置都一样
#mongo数据库配置在config
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
#浏览器设置
# browser = webdriver.Chrome()
# browser = webdriver.PhantomJS()
browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
wait = WebDriverWait(browser, 10)
browser.set_window_size(1400,900)
# 判断该元素是否加载完成,等待的最长时间为十秒
def search():
print('正在搜索')
try:
('https://www.taobao.com/')
input = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#q')))
submit = WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
#找到淘宝的搜索框还有搜索键
input.send_keys('美食')
submit.click()
total = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
get_product()
return total.text
except TimeoutException:
return search()
#输入“美食”
#WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
#程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
def next_page(page_number):
print('正在翻页',page_number)
try:
input = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
#输入页码数
submit = WebDriverWait(browser,10).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)))
get_product()
# 执行翻页操作(判断当前的页码是不是翻到的页数)
##mainsrp-pager > div > div > div > ul > li.item.active > span
# 判断是否为那一页
except TimeoutException:
#出错了则重新执行这一次请求
next_page(page_number)
def get_product():
wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
html = browser.page_source
doc = pq(html)
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
product = {
'image': item.find('.pic .img').attr('src'),
'price': item.find('.price').text(),
'deal' : item.find('.deal-cnt').text()[:-3],
'title': item.find('.title').text(),
'shop' : item.find('.shop').text(),
'location':item.find('.location').text()
}
print(product)
save_to_mongo(product)
def save_to_mongo(result):
try:
if db[MONGGO_TABLE].insert(result):
print('保存成功',result)
except Exception:
print('保存失败',result)
def main():
total = search()
#total=total.text
total = int(re.compile('(\d+)').search(total).group(1))
print(total)
for i in range(2,total+1):
next_page(i)
browser.close()
if __name__ == '__main__':
main()
这段代码我思考了一天
在第一天的时候我试着写selenium写一段实战秒杀天猫商品的代码,然后遇到了许多困难,这是基础不牢固导致的
遇到的困难有:
①不理解main方法的调用
②如何破解淘宝的验证码还有请求频繁限制
③def VerificationCode(source)需要传入的参数不理解
④函数前后顺序问题
我相信以后多敲代码,这些问题会解决的
在QPython编程交流中遇到了一个好友,在他的帮忙下解决了问题
感觉他的思想都值得我学习,并且很快找到的问题的解决方法
第二天做selenium实战的时候,遇到的问题如下
爆出warning,所以我一直以为是selenium不再支持phantomjs,然后我在网上查了许多方法
例如:
①下载selenium2.48,然后发现
这个问题是由下载的版本过低导致的(selenium3.14需要下载chromedriver,selenium2.48需要下载ghostdriver)
当时太着急解决问题,如果静下心来思考,很容易就能发现问题了,我在这里绕的圈子也有点多
②之后发现在selenium3.14版本下,整个headless chrome就可以运行了
在网上找的代码如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://cnblogs.com/")
print(driver.page_source)
经过测试可以实现
然而放到实战代码却不行,然后我又以为是phantomjs版本被弃用的问题,又绕了很大一个圈子
好友X跟我讲
经过测试确实可以,然后我就以为是我的版本问题,后来发现使用之前的PhantomJS也可以
后面我才发现是我的传参问题
我原先的传参是这样的:
大小写完全不对
修改如下:
就是这个错误就导致我浪费了一晚上时间,明天好好写写代码的讲解