python—selenuim行为链练习

猫眼电影用senlenuim爬取

senlenuim拿到网页源码——page_source

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# driver.page_source 获取html源代码
html = driver.page_source
print(html)

python—selenuim行为链练习_第1张图片
python—selenuim行为链练习_第2张图片

find()查看html中字符串是否存在

# find() 在html结构中查找某个字符串是否存在
## 5682  数字就证明字符串存在,数字没有规律
## 如果不存在就返回-1
print(driver.page_source.find('kw'))

get_attribute——定位某一标签后查看某一属性值,获取节点属性值

猫眼电影中,找到海报图片链接,是在a标签里面的src

python—selenuim行为链练习_第3张图片

# noed(元素对象) node.get_attribute
# get_attribute 获取数据属性值 定位元素位置,再用attribute获取属性值
# 爬取猫眼电影 https://maoyan.com/board/4
driver.get('https://maoyan.com/board/4')
time.sleep(1)
img_tag =driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/dl/dd[1]/a/img[2]')
#  结果https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c
print(img_tag.get_attribute('src'))

爬取猫眼电影top100

分析:数据在dl里面,一个dd标签就是一个电影数据

python—selenuim行为链练习_第4张图片
python—selenuim行为链练习_第5张图片

from selenium import webdriver
import csv
driver =webdriver.Chrome()

# 获取网页
driver.get('https://maoyan.com/board/4')

# 翻页
# 4
# 3
def get_one_page():
    ## 一个dd标签表示一个电影 获取所有dd 这里的所有dd指的是一页的数据10个
    dd_lst =driver.find_elements_by_xpath('//*[@id="app"]/div/div/div[1]/dl/dd')
    # .text 是获取节点和子节点和后代节点的文本内容
    dict ={
     }
    for dd in dd_lst:
        # 验证打印内容有什么规律,如果直接像这个呈现就不用其他,如果有其他就根据信息继续操作
        #1
    #  我不是药神
    #  主演:徐峥,周一围,王传君
    #  上映时间:2018-07-05
    #  9.6
    #     print(dd.text)
    #     print('*'*80)
        # 一个电影数据有换行符,所以用\n来分割
        one_film_info_lst =dd.text.split('\n')
        item ={
     }
        ## 赋值字典的key和value strip()是去空格
        # 异常捕获,except的就跳过就行
        try:

            item['rank'] =one_film_info_lst[0].strip()
            item['name'] = one_film_info_lst[1].strip()
            item['actor'] = one_film_info_lst[2].strip()
            item['time'] = one_film_info_lst[3].strip()
            item['score'] = one_film_info_lst[4].strip()
        except:
            pass
        print(item,type(item))
        return item
        # with open('猫眼电影.csv', 'w', encoding='utf-8', newline='')as f:
        #     dwriter = csv.DictWriter(f, fieldnames=('rank', 'name', 'actor', 'time', 'score'))
        #     dwriter.writeheader()
        #     dwriter.writerows(item)





# 翻页
# 4
# 3
# 10
while True:
    get_one_page()

    # 如果没有下一页就退出 下一页
    try:
        # 找不到最后一页,就会抛出异常,此刻就是最后一页
        driver.find_element_by_link_text('下一页').click()
    except Exception as e:
        # 直接自动关driver
        driver.quit()
        break

设置无界面设置

python—selenuim行为链练习_第6张图片

from selenium import webdriver

# 创建无界面模式 不会加载浏览器
# 创建chrome设置对象
options =webdriver.ChromeOptions()
# 设置无界面功能
options.add_argument('--headless')
# 加载驱动需要options=options
driver =webdriver.Chrome(options=options)
# driver.get('')

爬取jd商品

下拉框拉条设置——拖动大最下面,解决ajax动态加载——execute_script(

‘window.scrollTo(0,document.body.scrollHeight)’

)

#进入这个页面,把拖动条拖到最下面——就这个代码记熟了
        self.driver.execute_script(
            'window.scrollTo(0,document.body.scrollHeight)'
        )

python—selenuim行为链练习_第7张图片

价格的xpath

python—selenuim行为链练习_第8张图片

翻页处理——最后一页div属性是pn-next disabled,如果是其他页数(不是最后一页,就是pn-next)

python—selenuim行为链练习_第9张图片
python—selenuim行为链练习_第10张图片

用find()来处理——如果不是最后一页就继续点下一页(返回-1),如果是最后一页就break

python—selenuim行为链练习_第11张图片

代码呈现

from selenium import  webdriver
import time
# 一个li表示一个商品的数据
# 但是,把鼠标滑轮或者拖动拉动条往下拉会出现新的li标签,所以需要进入网页拖动拉条到最下面,等待一会,直到页面元素(所有li)出来,才抓取
# 如何拖动拖动条
## 用到加载js的方法

class JdSpider():
    def __init__(self):
        # 无头界面设置
        options =webdriver.ChromeOptions()
        options.add_argument('--headless')
        self.driver =webdriver.Chrome(options=options)
        self.driver.get('https://www.jd.com/')
        # 定位输入框和按钮'
        self.driver.find_element_by_xpath('//*[@id="key"]').send_keys('爬虫书')
        time.sleep(1)
        self.driver.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
        time.sleep(1)

    def parse_html(self):
        #进入这个页面,把拖动条拖到最下面——就这个代码记熟了
        ## execute_script('window.scrollTo(0,document.body.scrllHeight)')
        self.driver.execute_script(
            'window.scrollTo(0,document.body.scrollHeight)'
        )
        time.sleep(3)

        # 提取数据, 找到ui千万万不要忘记写li 找到所有的li
        li_lst =self.driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li')
        for li in li_lst:
            # print(li.text)
            # print('*'*50)
            ## 发现数据有点乱,所以要针对需求来明确数据
            try:

                item ={
     }
                item['price'] =li.find_element_by_xpath('.//div[@class="p-price"]/strong').text.strip()
                item['name'] = li.find_element_by_xpath('.//div[@class="p-name"]/a/em').text.strip()
                item['price'] = li.find_element_by_xpath('.//div[@class="p-commit"]/strong').text.strip()
                item['price'] = li.find_element_by_xpath('.//div[@class="p-shopnum"]/a').text.strip()
                print(item)
            except Exception as e:
                print(e)





    def main(self):
        while True:

            self.parse_html()
            if self.driver.page_source.find('pn-next disabled') == -1:
                self.driver.find_element_by_xpath('//*[@id="J_bottomPage"]/span[1]/a[9]').click()
                time.sleep(1)
            else:
                self.driver.quit()
                break




if __name__ == '__main__':
    spider =JdSpider()
    spider.main()

你可能感兴趣的:(python爬虫笔记,python,selenium)