文章目录
1 资料2 笔记2-1 准备2-1-1. 网址2-2-2 文本位置2-2 代码2-2-1 原型2-2-2 ver0.11 资料
《Python网络爬虫从入门到实践》唐松,陈志铨。主要面向windows平台下的python3。2 笔记
2-1 准备
本章实践项目的目的是获取Airbnb深圳前20页的短租房源。作为Airbnb的超赞房东,笔者特别喜欢Airbnb的理念,同时需要监控和了解竞争对手的房屋名称和价格,这样才能让自己的房子有竞争力。
本项目需要获取前20页短租房源的名称、价格、评价数量、房屋类型、床数量和房客数量。网页地址为:/s/Shenzhen–China?page=1
2-1-1. 网址
之前的网址内容改变了,实际爬取的网址第一页为/s/Shenzhen–China/homes?query=Shenzhen,%20China&screen_size=large&refinement_paths%5B%5D=/homes&click_referer=t:SEE_ALL%7Csid:0c7b844d-c81d-4fea-ab73-579bccc8c068%7Cst:MAGAZINE_HOMES&title_type=MAGAZINE_HOMES&last_search_session_id=0c7b844d-c81d-4fea-ab73-579bccc8c068
第二页为/s/Shenzhen–China/homes?refinement_paths%5B%5D=%2Fhomes¤t_tab_id=home_tab&selected_tab_id=home_tab&screen_size=large&click_referer=t%3ASEE_ALL%7Csid%3A0c7b844d-c81d-4fea-ab73-579bccc8c068%7Cst%3AMAGAZINE_HOMES&title_type=MAGAZINE_HOMES&hide_dates_and_guests_filters=false&place_id=ChIJkVLh0Aj0AzQRyYCStw1V7v0&s_tag=PG0WiDLi§ion_offset=4&items_offset=18&last_search_session_id=70170a63-acec-4467-9e22-ad3fdd0271a5
第三页为/s/Shenzhen–China/homes?refinement_paths%5B%5D=%2Fhomes¤t_tab_id=home_tab&selected_tab_id=home_tab&screen_size=large&click_referer=t%3ASEE_ALL%7Csid%3A0c7b844d-c81d-4fea-ab73-579bccc8c068%7Cst%3AMAGAZINE_HOMES&title_type=MAGAZINE_HOMES&hide_dates_and_guests_filters=false&s_tag=PG0WiDLi§ion_offset=4&items_offset=36&place_id=ChIJkVLh0Aj0AzQRyYCStw1V7v0&last_search_session_id=36cce69d-bb21-4e65-93b7-4a6e3f3f7fb4
实验证明,以上一长串内容只要取第一页以后任意一页修改items_offset
的值为(n-1)*18就可以跳转到第n页。后面的last_search_session_id
虽然一直在变,但可以用同一个数值访问所有页面。
另外,后面一长串&相连的内容可以随机调换顺序,却不影响访问。
2-2-2 文本位置
通过方法1(通过浏览器审查元素解析真实网页地址)需要的似乎是这些网址
<script defer="" crossorigin="anonymous" src="/airbnb/static/packages/AsyncChinaSignupModal~AsyncSignupModal~AsyncSimpleSignupModal~ChinaReservationCenterDetailPageContai~96144fd8-94878cf1.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/AsyncLoginModal~AsyncSignupModal~ChinaReservationCenterDetailPageContainer~EmbedModal~MarketplacePDP~cb57683b-caa2c37d.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/ChinaReservationCenterDetailPageContainer~HomesCheckoutFlowApp_WhosComingContainer_async~HomesChecko~237e18f8-a2aae0a3.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/ChinaBrowsingHistoryPage~ChinaReservationCenterDetailPageContainer~ChinaReservationCenterListPageCon~86d14141-cfea1498.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/MarketplacePDP-SimilarListings~PageSlot-ExploreController~SelectPDP-SelectSimilarListings~TopUserLis~a8c8c3d1-8423fd03.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/MarketplacePDP-SimilarListings~PageSlot-ExploreController~TopUserListingsControllerAsync~webcot-chin~7b112600-947ad801.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/PageSlot-ExploreController~TopUserListingsControllerAsync~explore-original-content-section_listings~~8b5ba336-11b7608f.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/PageSlot-ExploreController~TopUserListingsControllerAsync~webcot-ChinaHomesPDPContainer~webcot-china~4354cb10-36ed9b05.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/PageSlot-ExploreController~webcot-china-CrossVerticalSearchContainer_async~webcot-china-ExperiencesS~f8a9d6cf-4044105b.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/webcot-china-CrossVerticalSearchContainer_async~webcot-china-ExperiencesSearchContainer_async~webcot~be630438-197365b6.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/PageSlot-ExploreController~explore-original-content-section_listings~explore-original-content-sectio~3edab506-9a7c8870.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/PageSlot-ExploreController~explore-original-content-section_contextual_searches~webcot-china-CrossVe~3f3378bc-38c4058c.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/webcot-china-CrossVerticalSearchContainer_async~webcot-china-ExperiencesSearchContainer_async~webcot~ec3d75cf-5ea871f5.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/PageSlot-ExploreController~explore-original-content-section_inserts~webcot-china-CrossVerticalSearch~0894e9b1-37e0947a.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/explore-original-content-section_list_headers~webcot-china-CrossVerticalSearchContainer_async~webcot~03e01e4e-811aaa9a.js" type="application/javascript"></script><script defer="" crossorigin="anonymous" src="/airbnb/static/packages/webcot-china-HomesSearchContainer_async-1046c577.js" type="application/javascript"></script>
这些网址没什么规律的,也找不到一个总的,如果用静态的requests会死人的。所以还是乖乖用Selenium库把。
至于要查找的信息,它们位置如下:
div._fhph4u 17项内容位置
div._qlq27g 每一项文本位置
div._1etkxf1 span.fk7kh10 innerText:独立房间 · 1室2卫1床
div._1revvmz div._qhtkbey innerText:深圳北站 大床房 直达香港口岸/出差首选 1.8米超大床房 温馨舒适北欧风公寓
div._13o4q7nw span._1clmxfj innerText: “4.9分 · 252条评论”
div._1ixtnfc innerText: “价格↵¥168”
2-2 代码
2-2-1 原型
from selenium import webdriverfrom selenium.webdriver.chrome.webdriver import WebDriver# 要调用的浏览器driver地址,根据浏览器不同实现方式会有所差别# chrom.webdriver里对应的参数需要的是一个字符串,如果不给数据它会去找$PATHexecutable_path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'# 产生对象driver = WebDriver(executable_path=executable_path)link = "/s/Shenzhen--China/homes?refinement_paths%5B%5D=%2Fhomes&" \"current_tab_id=home_tab&selected_tab_id=home_tab&screen_size=large&click_refer" \"er=t%3ASEE_ALL%7Csid%3A0c7b844d-c81d-4fea-ab73-579bccc8c068%7Cst%3AMAGAZINE_HO" \"MES&title_type=MAGAZINE_HOMES&hide_dates_and_guests_filters=false&s_tag=PG0WiD" \"Li§ion_offset=4&place_id=ChIJkVLh0Aj0AzQRyYCStw1V7v0&last_search_session_i" \"d=36cce69d-bb21-4e65-93b7-4a6e3f3f7fb4&items_offset="for i in range(10): # 这里只打算查询前10页driver.get(link + "{}".format(i * 18)) # 第i页的items_offset=i * 18all_item = driver.find_element_by_css_selector("div._fhph4u")items = all_item.find_elements_by_css_selector("div._qlq27g") # 使用find_elements_by……()获得包含17项的一个列表for j in range(len(items)):name = items[j].find_element_by_css_selector("div._qhtkbey")print(name.text)driver.close()
结果
LADYMA |原宿 摩洛哥风格 福田CBD会展中心#家庭影院CocoPark福田皇岗口岸岗厦地铁口【十二微邸】14J-KKmall楼上的城市微魔方【宫遇】17-KKmall楼上一房一厅--【Loft时代】[Misa’s house] ‘想‘老街地铁口/kkmall万象城罗湖口岸/ins风商务房/直达香港深圳北站 大床房 直达香港口岸/出差首选 1.8米超大床房 温馨舒适北欧风公寓【双子座】近罗湖口岸|kkmall|东门老街|ins风|波波池|巨幕投影仪美食街|loft|罗湖口岸|双地铁|巨幕影院 | 游泳池1-3人公寓水贝珠宝园7号线地铁出口高端居家公寓(初见)罗湖阅见·生活美学公寓城景大床房近地王大厦万象城大剧院D出口【十二微邸】28H-KKmall楼上的心所微山水覔舍·A#紧邻南科大校区#地铁5号线塘朗站#大落地窗#米家智能家居#100寸投影#赠送早餐#免费撸猫燈塔·時光 Clean warm and cozy place【深圳北站|幸会·书院】近地铁4号直达会展中心/福田口岸-城市空中花园-独立房间(只能住①人喔)「星星的杂货铺」西丽•366大街【有猫】独立房间幻想-深圳南山高新园地铁站 近深大/世界之窗/万象天地/海岸城/华侨城超棒新房「木夕」地铁口/九方购物中心楼上/深圳北站 /直达福田口岸 全新日式风公寓暖空调 溜达家 带浴缸的明亮房子 白色空间 美式风格紧邻3号线地铁口 龙岗中心城 万科广场 单房整租猫筑AirCat#高新园万象天地北欧风智能公寓配大投影及开放式厨房【谧境】KKMALL楼上|万象城|老街美食中心|罗湖口岸|直达香港-北欧文艺小清新 落地窗城市谧境K's 【Room2】福田CBD【三地铁口】【可健身】【柯基狗狗陪伴】【家庭影院】[蜜桃家]ins少女心.深圳北站/ 九方购物中心/直达香港/地铁旁精致单人间【粉粉少女心+网红打卡】-会展中心CBD皇岗口岸福田口岸购物公园福田高铁站【水泥盒子1】の【惊蛰】(独立卫浴间)(1只蓝猫)(有共享空间)男生舱·深圳星语太空舱酒店(会展中心岗厦店,近地铁站,近香港,适合团队入住,岗厦地铁A出口)0号店近海岸城深圳大学科技园11号线南山地铁站直达机场/温馨舒适清新公寓整租【NiteNite奈奈】地铁口 水贝珠宝东门独立阳光创意公寓 1min Sta.stylish ap【法式小屋】 近科技园、深大,地铁口直达机场&高铁站|超赞房东【晨曦Dawn · 三兮】日式榻榻米、巨幕投影套房,福田中心区 会展中心皇岗福田双口岸,紧邻地铁口日式公寓,福田CBD中心,靠近会展中心糖果-10分钟深圳北站/20分钟会展中心/25分钟去福田港口,过港方便,30分钟去深圳火车站【商务投影系列】,全高清投影,整套公寓,地铁直达莲花山,福田口岸香港,会展中心。只为更懂生活的你。warm apartment in LuoWu罗湖口岸火车站五分钟AI购物公园旁石厦地铁口的落地窗景观房复式:福田市中心打卡精装香蜜小筑(双地铁)ShenZhen FuTian促销优惠~罗湖口岸旁有点不错的日式风格复式公寓「神田」罗湖口岸/老街/日式榻榻米一居/加床可住4人/落地窗观老街明式新中式风格现代公寓深圳北站/九方购物中心/地铁直达福田口岸~全新豪华公寓ins#椿#地铁口步行5分钟/近世界之窗/深大/春茧体育馆/科技园/高新园站/大幕布投影大梅沙180度绝色海景智能门锁海风清爽精品民宿免费停车深圳福田CBD與香港24小时通关口岸的双地铁五星商務酒店公寓「木夕」深圳北站/九方购物中心/地铁口/地铁直达福田口岸/简约黑白灰北欧公寓碧海潮生阁 明亮清新一线海景四人双床房[mikiko’s house]ins Korean style舒适卧室/地铁旁/近深圳北站直达HKTO SLEEP·图眠 白色简约风新房上线:超大高空落地窗/东门老街地铁口/罗湖口岸/京基地王万象城【B10ivy】巨幕影院 有猫 VPN外网直连 Live推荐 华侨城香蜜湖 近科技园福田深圳湾KKmall-13-京基100楼上一房一厅-临近万象城/地王/荔枝公园【城遇】樱空 日式loft公寓 近罗湖口岸国贸金光华万象城东门 双地铁口 好住好逛又好吃科技园/地铁口/近万象天地/深大/100寸巨屏投影/日式现代/影室[蜜桃家] 无印良品日式风/深圳北站/九方购物中心/地铁旁/直达香港
2-2-2 ver0.1
import timefrom selenium import webdriverfrom selenium.webdriver.chrome.webdriver import WebDriver# 要调用的浏览器driver地址,根据浏览器不同实现方式会有所差别# chrom.webdriver里对应的参数需要的是一个字符串,如果不给数据它会去找$PATHexecutable_path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'# 产生对象driver = WebDriver(executable_path=executable_path)link = "/s/Shenzhen--China/homes?refinement_paths%5B%5D=%2Fhomes&" \"current_tab_id=home_tab&selected_tab_id=home_tab&screen_size=large&click_refer" \"er=t%3ASEE_ALL%7Csid%3A0c7b844d-c81d-4fea-ab73-579bccc8c068%7Cst%3AMAGAZINE_HO" \"MES&title_type=MAGAZINE_HOMES&hide_dates_and_guests_filters=false&s_tag=PG0WiD" \"Li§ion_offset=4&place_id=ChIJkVLh0Aj0AzQRyYCStw1V7v0&last_search_session_i" \"d=36cce69d-bb21-4e65-93b7-4a6e3f3f7fb4&items_offset="for i in range(10): # 这里只打算查询前10页driver.get(link + "{}".format(i * 18)) # 第i页的items_offset=i * 18all_item = driver.find_element_by_css_selector("div._fhph4u")items = all_item.find_elements_by_css_selector("div._qlq27g") # 使用find_elements_by……()获得包含17项的一个列表for j in range(len(items)):try:house_infor = dict()house_infor["name"] = items[j].find_element_by_css_selector("div._qhtkbey").texthouse_infor["type"] = items[j].find_element_by_css_selector("div._1etkxf1").texthouse_infor["evaluate"] = items[j].find_element_by_css_selector("div._13o4q7nw").texthouse_infor["price"] = items[j].find_element_by_css_selector("div._1ixtnfc").textprint(str(house_infor))except Exception as e:print("这个元素已失效")time.sleep(5)driver.quit()
其中try……expect是为了这两个因为网页动态刷新出现的错误准备的:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"div._1etkxf1"}(Session info: chrome=77.0.3865.90)Message: stale element reference: element is not attached to the page document(Session info: chrome=77.0.3865.90)```(但它也导致一页只要有一个出错,后面的全部不处理)另一方面,实际运行时,结果因为网页跳转太快而无法显示完全,能有多少内容完全看脸(网速)。(time.sleep就是尝试用来对付它的,但失败了)比对书中代码,方法上没有什么不同的地方,看来这个问题只能以后再说了(因为百度了半天啥也没找到)。