python之selenium爬取数据(爬取airbnb房源信息)

selenium介绍

在这里插入图片描述

Selenium是一个用于Web应用程序测试的工具,测试直接在浏览器中运行,就像真实用户所作的同样,目前流行的自动化测试就能够靠它来实现css

而自动化测试还须要用咱们的webdriver
WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持建立更高级的测试,避免了JavaScript安全模型致使的限制。除了来自浏览器厂商的支持,WebDriver还利用操做系统级的调用模拟用户输入。python

今天就是利用这两个结合来爬取airbnb的房源信息web

首先咱们须要下载咱们浏览器对应版本的WebDriver,好比个人谷歌版本ajax

在这里插入图片描述
Chrome的WebDriver各个版本下载地址:http://npm.taobao.org/mirrors/chromedriver
若是是其余浏览器就直接去百度了chrome

而后下载好了有一个chromedriver.exe文件,把这个文件放入你的python的Script中,这样就能用了
在这里插入图片描述npm

Fidder是一个抓包工具,咱们若是须要爬取一些动态数据,也就是咱们ajax加载出来的数据,咱们通常是没法直接在网页上看到的,因此须要经过抓包工具来获取请求地址
Fidder官网:https://www.telerik.com/fiddler
它能获取你电脑全部发送的请求浏览器

案例

demo1,爬取今日头条的某条新闻的评论,评论通常是ajax加载出来的,因此通常是动态数据,全部首先咱们须要经过抓包工具来获取它的请求地址(由于F12获取不到一些数据地址,因此咱们须要下载抓包工具),而后才能获取它的数据。安全

""" 使用sekenium哦啊去今日头条新闻评论 """
from selenium import webdriver
import time

# options = webdriver.ChromeOptions()
# options.add_argument("--headless")

driver = webdriver.Chrome()
driver.get("https://www.toutiao.com/group/6749399264998212110/")

# 获取 加载更多 超连接
loadMore = driver.find_element_by_css_selector("a.c-load-more")
# 模拟浏览器点击事件
loadMore.click()

time.sleep(2)
# 获取数据
contentDivs = driver.find_elements_by_css_selector("div.c-content")
for contentDiv in contentDivs:
    content = contentDiv.find_element_by_tag_name("p").text
    print(content)

而后存入了咱们的text文件中,能够看到,这就是一个JSON的返回数据session

{'message': 'success', 'data': {'has_more': True, 'total': 106, 'comments': [{'text': '限制的是在北京居住生活而长期驾驶非京牌车的行为。正常来京办事不受影响。北京车牌到外地也是短时间的,因此不存在外地也限制北京车的问题。', 'digg_count': 615, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571398213, 'user': {'avatar_url': 'https://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3796/2975850990~120x256.image', 'user_id': 100388200396, 'name': '人间正道的丝路花雨'}, 'dongtai_id': '6749103925351350275', 'user_digg': 0, 'id': '6749103925351350275'}, {'text': '支持,早该限制外地牌照,就像北京的房子,外地人来京就租房子,若是您来就盖房这地方就没办法生活了', 'digg_count': 686, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571398053, 'user': {'avatar_url': 'https://p3.pstatp.com/thumb/dafd0002dc655e0d9151', 'user_id': 52617043834, 'name': '点1449308'}, 'dongtai_id': '6749103240320647171', 'user_digg': 0, 'id': '6749103240320647171'}, {'text': '举双手同意👍', 'digg_count': 661, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571396160, 'user': {'avatar_url': 'https://p3.pstatp.com/thumb/d27f0006a5762a61b9be', 'user_id': 104695473564, 'name': '用户3402788733913'}, 'dongtai_id': '6749095107699834891', 'user_digg': 0, 'id': '6749095107699834891'}, {'text': '为何高校的外地大学生也能摇号 这个应该强烈取消,对于倒牌租牌的必须严厉打击', 'digg_count': 1138, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571396498, 'user': {'avatar_url': 'https://p1.pstatp.com/thumb/d2750002da446cb98689', 'user_id': 5529218321, 'name': '冲吧快点跑起来'}, 'dongtai_id': '6749096559210004484', 'user_digg': 0, 'id': '6749096559210004484'}, {'text': '外地牌照的车辆停放在小区或者是单位停车场或者是收费停车场,应该一样计算进京天数!', 'digg_count': 624, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571398075, 'user': {'avatar_url': 'https://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/1682/3145828489~120x256.image', 'user_id': 2730074632, 'name': '海边漫步998'}, 'dongtai_id': '6749103332142710791', 'user_digg': 0, 'id': '6749103332142710791'}, {'text': '应该限制车厂制造车,毎年定额生产。', 'digg_count': 643, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571397297, 'user': {'avatar_url': 'https://p1.pstatp.com/thumb/18a500156e0d82546575', 'user_id': 58555087014, 'name': '雪域雄鹰154353004'}, 'dongtai_id': '6749099992096899083', 'user_digg': 0, 'id': '6749099992096899083'}, {'text': '好政策,建议全国推广', 'digg_count': 992, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571397173, 'user': {'avatar_url': 'https://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/12314/6983640146~120x256.image', 'user_id': 5915498034, 'name': '豆豆妈妈0224'}, 'dongtai_id': '6749099455637028876', 'user_digg': 0, 'id': '6749099455637028876'}, {'text': '太好了,抓紧执行,甚至能够市民举报那也长期停小区的外地车牌!这是大好事,特别是五环外加大摄像头安装力度,出发加大!绝对有效果,我天天走北清路,看见那么多外地车牌能急死!赶快执行!', 'digg_count': 405, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571398372, 'user': {'avatar_url': 'https://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3792/5112637127~120x256.image', 'user_id': 751664149832952, 'name': '用户3270503631001'}, 'dongtai_id': '6749104609777991692', 'user_digg': 0, 'id': '6749104609777991692'}, {'text': '九年了摇不到号,有谁理解京籍无牌的无奈', 'digg_count': 1386, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571396690, 'user': {'avatar_url': 'https://p1.pstatp.com/thumb/daf3000cf6d54a9d5c1a', 'user_id': 71915332222, 'name': '享受love生活'}, 'dongtai_id': '6749097386192322573', 'user_digg': 0, 'id': '6749097386192322573'}, {'text': '早就应该限制外地牌照的车辆在京行驶', 'digg_count': 305, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571398530, 'user': {'avatar_url': 'https://p1.pstatp.com/thumb/dac200086724d1e8372b', 'user_id': 106782828584, 'name': '呵呵Jess'}, 'dongtai_id': '6749105286193168398', 'user_digg': 0, 'id': '6749105286193168398'}, {'text': '天津应该效仿北京同样。', 'digg_count': 454, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571394897, 'user': {'avatar_url': 'https://p1.pstatp.com/thumb/249b000528b5c2b38082', 'user_id': 5977279152, 'name': '道可道74026434'}, 'dongtai_id': '6749089679897313284', 'user_digg': 0, 'id': '6749089679897313284'}, {'text': '今年已经办理12次进京证的车,11月1日之后不能再办理进京证,试模以待', 'digg_count': 96, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571395234, 'user': {'avatar_url': 'https://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/dacb000c8743262a17b7~120x256.image', 'user_id': 15489613223, 'name': '世代通州'}, 'dongtai_id': '6749091125531164676', 'user_digg': 0, 'id': '6749091125531164676'}, {'text': '外地来京施工的咋办?', 'digg_count': 107, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571396343, 'user': {'avatar_url': 'https://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/424b9abdcae34f5397bd0aa86ee9569a~120x256.image', 'user_id': 64601362558, 'name': '用户2684321727399'}, 'dongtai_id': '6749095892525481992', 'user_digg': 0, 'id': '6749095892525481992'}, {'text': '外地牌 平时开车出去,路上大部分都仍是京牌。', 'digg_count': 127, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571396598, 'user': {'avatar_url': 'https://p9.pstatp.com/thumb/1dce0006dc857f0fe56c', 'user_id': 5561064933, 'name': '瞧瞧这个世界'}, 'dongtai_id': '6749096989880958980', 'user_digg': 0, 'id': '6749096989880958980'}, {'text': '通州区的本地人,外地拍照怎么办?', 'digg_count': 88, 'reply_data': {'reply_list': []}, 'reply_count': 0, 'create_time': 1571395139, 'user': {'avatar_url': 'https://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/fe300000836bfe9e2ec4~120x256.image', 'user_id': 111064369262, 'name': '流浪一只羊'}, 'dongtai_id': '6749090718713151495', 'user_digg': 0, 'id': '6749090718713151495'}]}}

demo2,爬取airbnb房源信息
在爬取每个网站的信息时,你都要先分析出它的数据结构组成,而后咱们找到咱们须要的class名或者id或者其余的,咱们经过这些标签名来获取它的内容数据结构

""" 使用selenium爬取 airbnb房源信息 """

from selenium import webdriver
import time

# 让浏览器不打开
# options = webdriver.ChromeOptions()
# options.add_argument("--headless")
chrome = webdriver.Chrome()

# 每页18条
for page in range(18):
    print(f"第{page+1}页数据:")
    chrome.get(f"https://www.airbnb.cn/s/长沙/homes?refinement_paths%5B%5D=%2Fhomes&current_tab_id=home_tab&selected_tab_id=home_tab&screen_size=large&hide_dates_and_guests_filters=false&place_id=ChIJxWQcnvM1JzQRgKbxoZy75bE&s_tag=vaaWeg7D&section_offset=4&items_offset={page*18}&last_search_session_id=7d2afba3-cc47-434c-92be-65bac7643d3b")

    houseAll = chrome.find_elements_by_css_selector("div._gig1e7")
    i=1
    for house in houseAll:
        # 名称
        name = house.find_element_by_css_selector("div._qhtkbey").text

        # 价格
        price = house.find_element_by_css_selector("div._1ixtnfc").text
        newprice = house.find_element_by_css_selector("div._1ixtnfc").text

        # 类型及大小
        typeSize = house.find_element_by_css_selector("span._fk7kh10").text

        type = typeSize.split(" · ")[0]
        size = typeSize.split(" · ")[1]

        print(f"{i}{name} {newprice} {type} {size}")
        # 每一条数据停顿时间
        time.sleep(2)
        i = i+1

    # 每一页停顿多久
    time.sleep(3)