初学selenium,有点小心得分享下~~
首先默认你安装好了selenium+chrome,其中chromedriver下载后把文件解压,然后放到本机chrome浏览器文件路径里,网上有很多配置方法,自行百度即可。
搜selenium发现有有头和无头两种,大概明白有头就是使用selenium会自动打开浏览器,无头就是在背后默默的运行,不打开浏览器。
有头模式:
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window() #将窗口最大化,最好加上这段代码避免出错
driver.get('https://www.taobao.com/')
如下面所示,有头模式会自动打开网页,且窗口实现了最大化(避免小窗口遮挡一些重要的按钮)
无头模式:
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(options=chrome_options) #为chrome浏览器设置参数
driver.maximize_window() #最大化浏览器
driver.get('https://www.taobao.com')
print(driver.current_url) #打印下当前页看还不是默默的打开了
现在爬淘宝网页需要登录才能浏览商品信息,使用selenium也是这样
from selenium import webdriver #调用selenium的webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.taobao.com/') #请求淘宝网
driver.find_element_by_xpath('//*[@id="q"]').clear() #将搜索输入框里的内容清空
driver.find_element_by_xpath('//*[@id="q"]').send_keys('女羽绒服') #在搜索输入框中输入要爬去的商品的关键词
driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click() #点击搜索的按钮
print(driver.current_url) #打印当前页面
#selenium其实就是在模拟人的行为
由于需要登录用户信息,导致我们的爬虫程序被打断,可以再使用selenium去模拟人的登录,输入账号和密码以及滑动,但是觉得很麻烦还会有各种各样的bug,所以决定用类似于cookie的方法即利用保存在电脑上的chrome用户信息来登录淘宝。
#为了方便看选择了有头模式
from selenium import webdriver
chrome_options = webdriver.ChromeOptions() #初始化,就是有这句就对了
chrome_options.add_argument('--no-sandbox') #避免出错
chrome_options.add_argument(r'user-data-dir=C:\Users\xuxiaojie01\AppData\Local\Google\Chrome\User Data')
#是浏览器数据存储路径,保存用户信息的地方
driver = webdriver.Chrome(options=chrome_options)# 为chrome浏览器设置参数
driver.maximize_window()
driver.get('https://www.taobao.com/')
driver.find_element_by_xpath('//*[@id="q"]').clear()
driver.find_element_by_xpath('//*[@id="q"]').send_keys('女羽绒服')
driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()
print(driver.current_url)
WebDriverException: unknown error: Chrome failed to start: crashed
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location C:\Program Files (x86)\Google\Chrome\Application\chrome.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
(Driver info: chromedriver=71.0.3578.80 (2ac50e7249fbd55e6f517a28131605c9fb9fe897),platform=Windows NT 10.0.17134 x86_64)
这里报错了!!!!!最坑的就是这里,搜了半天也没找到原因,后来猛然想起如果使用用户信息,不会调起新的chrome,所以这里会出错,占用了!!!!因此我们需要把现在开的chrome都关掉再执行
这就正常啦~~~撒花
下面直接爬去网页信息即可~~
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lxml import etree
import csv
import random
chrome_options = Options()
chrome_options.add_argument('--headless')#设置浏览器无头模式
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument(r'user-data-dir=C:\Users\xuxiaojie01\AppData\Local\Google\Chrome\User Data')
#设置浏览器用书数据存储路径,可以以登陆模式浏览网站
driver = webdriver.Chrome(options=chrome_options)# 为chrome浏览器设置参数
driver.maximize_window()#最大化浏览器
def get_ourl(url):
driver.get(url)#打开网页
driver.implicitly_wait(random.randint(8,20))#显式等待6s,此处可以考虑吧调用randint随机等待一定时间
def output_file(product):#写入csv文件
f = open('C:/Users/82449/Desktop/taoabo.csv', 'a+', encoding='utf-8', newline='')
writer = csv.writer(f)
writer.writerow(product)
def get_purl(url):
print(url)
driver.get(url)
driver.implicitly_wait(random.randint(10,20))
#print(driver.page_source)
html = etree.HTML(driver.page_source)#获取打开网页的网页源代码
products = html.xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div')#xpath解析网页
for p in products:
data = p.xpath('div[2]/div[2]/a')[0]
name = data.xpath('string(.)').strip()
shop = p.xpath('div[2]/div[3]/div[1]/a/span[2]/text()')[0]
place = p.xpath('div[2]/div[3]/div[2]/text()')[0]
price = p.xpath('div[2]/div[1]/div[1]/strong/text()')[0]
print(shop, place, name, price)
output_file([shop, place, name, price])
def get_next_page(url):
driver.get(url)
driver.implicitly_wait(random.randint(8,20))
driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/ul/li[8]/a').click()#点击跳转下一页
print(driver.current_url)
return (driver.current_url)
if __name__ == '__main__':
get_ourl('https://www.taobao.com/?spm=a230r.1.0.0.601d1254rxud90')
driver.find_element_by_xpath('//*[@id="q"]').clear()#清空搜索框数据
driver.find_element_by_xpath('//*[@id="q"]').send_keys('女 加厚夹棉绒面睡衣')#输入检索词
driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()#点击搜索按钮
#main_url = '='.join(driver.current_url.split('=')[1:])
output_file(['shop', 'place', 'name', 'price'])
url = driver.current_url#返回当前网页url链接
for i in range(3):
get_purl(url)
url = get_next_page(driver.current_url)
因为上面内个报错,愤怒写了这篇文章~~~又不对的地方欢迎指正~
如果大家喜欢爬虫但和我一样是小白的话,推荐一个作者 罗攀的书
《从零开始学python网络爬虫》
作者特别好,会耐心解答读者的问题,他的公众号(罗罗攀)也会分享一些简单的小例子,比较适合刚刚刚刚刚刚入门的~