>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
说明:仅学习参考,如有侵权,将立即删除此内容
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
version_1
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
目标:爬去斗鱼的房间信息
domain = "https://www.douyu.com/g_yz"
技术: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)本例使用的是"https://www.douyu.com/g_yz",只是抓取了部分内容,但是斗鱼的网页结构性很强,所以能够通用。
将self.start_url换成任何分类下的首网址即可复用,如“https://www.douyu.com/directory/all”抓取所有内容,
也行得通。
源码:
from selenium import webdriver import time import json class DySpider(): def __init__(self): self.start_url = 'https://www.douyu.com/g_yz' self.driver = webdriver.Chrome() def parse_source(self): # 强制等待10s time.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']").text item["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']").text item["room_tag"] = li.find_element_by_xpath(".//span[@class='DyListCover-zone']").text item["room_hot"] = li.find_element_by_xpath(".//span[@class='DyListCover-hot']").text print(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 None return li_item,next_page_url def 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): # 请求第一个url self.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()