python爬虫之selenium+chrome 爬去淘宝商品信息

python爬虫之selenium+chrome 爬去淘宝商品信息

初学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)   #打印下当前页看还不是默默的打开了

如下面所示,无头模式不会自动打开网页(默默的)
python爬虫之selenium+chrome 爬去淘宝商品信息_第1张图片

爬网页信息需要登录怎么办?

现在爬淘宝网页需要登录才能浏览商品信息,使用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网络爬虫》
作者特别好,会耐心解答读者的问题,他的公众号(罗罗攀)也会分享一些简单的小例子,比较适合刚刚刚刚刚刚入门的~

你可能感兴趣的:(python爬虫)