admin 管理员组

文章数量: 894198

爬取斗鱼房间的信息

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

说明:仅学习参考,如有侵权,将立即删除此内容

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
version_1
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

目标:爬去斗鱼的房间信息
domain = ""

技术:selenium
难点:
(1)在通过find_element_by_xpath选择元素的时候,一定要注意标签内属性的值,前后是否有空格,
这是最容易出错的地方,如" hahah"或"hahah "等情况,结合网页源码一起看。
(2)需要强制等待,以让网页显示完整的数据,方便提取数据。

说明:
(1)通过find_element_by_xpath来找元素很慢,理想的使用场景是:通过selenium抓取到网页源代码,
然后通过xpath或bs4或正则,来提取关键信息,最后通过find_elements_by_xpath来提取下一页地址,
然后循环上一步。
也就是说只通过selenium来实现网页源代码的抓取,模拟人的点击操作或链式操作,
然后通过xpath或bs4或正则,来提取关键信息。
(2)需要使用强制等待,即time.sleep(),时间的长度,可以由函数生成,不过要保证最低等待时间。
(3)本例使用的是"",只是抓取了部分内容,但是斗鱼的网页结构性很强,所以能够通用。
将self.start_url换成任何分类下的首网址即可复用,如“”抓取所有内容,
也行得通。

源码:

from selenium import webdriver
import time
import jsonclass DySpider():def __init__(self):self.start_url = ''self.driver = webdriver.Chrome()def parse_source(self):# 强制等待10stime.sleep(10)# 分组li_list = self.driver.find_elements_by_xpath("//ul[@class='layout-Cover-list']/li")print("当前页内容数量",len(li_list))li_item = list()for li in li_list:item = dict()item["room_title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").textitem["room_image"] = li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']").get_attribute("src")item["room_href"] = li.find_element_by_xpath(".//a[@class='DyListCover-wrap']").get_attribute("href")item["room_anchor"] = li.find_element_by_xpath(".//h2[@class='DyListCover-user']").textitem["room_tag"] = li.find_element_by_xpath(".//span[@class='DyListCover-zone']").textitem["room_hot"] = li.find_element_by_xpath(".//span[@class='DyListCover-hot']").textprint(item)li_item.append(item)next_page_url = self.driver.find_elements_by_xpath("//div[@class='ListFooter']//li[@class=' dy-Pagination-next']")print("next_page_url:",next_page_url)next_page_url = next_page_url[0] if len(next_page_url)>0 else Nonereturn li_item,next_page_urldef savefile_to_json(self,filename,content):with open(filename,'w',encoding='utf8') as f:f.write(json.dumps(content,ensure_ascii=False,indent=2))print("保存"+filename+"文件成功")def run(self):# 请求第一个urlself.driver.get(self.start_url)# 处理get到的内容,获取下页地址li_item,next_page_url = self.parse_source()# 保存内容到列表room_content = list()room_content.append(li_item)# 循环处理下一页while next_page_url is not None:next_page_url.click()# 处理get到的内容,获取下页地址li_item, next_page_url = self.parse_source()# 保存内容到列表room_content.append(li_item)self.savefile_to_json("斗鱼_颜值.json",room_content)self.driver.close()if __name__=='__main__':obj = DySpider()obj.run()

本文标签: 爬取斗鱼房间的信息