通‘百度百科’(百度百科_全球领先的中文百科全书)和‘去哪儿旅行’(北京旅游攻略-2022北京自助游-周边自驾-游玩攻略-自由行-吃喝玩乐指南-去哪儿攻略)两个网站对数据库中的景点爬取了对应的景点描述信息,并进行数据清洗保存。
下面是利用selenium框架爬取信息的代码部分和我想要爬的需求:
我想通过北京景点实体的名称找到对应的景点实体描述,用来扩充库中的信息。
其中景点实体就是这个景点叫啥名,大概有几千个吧
就需要去找到对应实体的景点信息描述,比如上面我提到的两个网站,分别如下图所示:红色框内部就是我想要爬取的文件,但是我又不想要太多,只想要相对简洁的一句话
因为每个实体都要去查询爬取,下面就是循环实体词的脚本,相当简单。。。data就是含有实体关键词的txt文件,目的就是一个词一个词的去爬取对应信息
def main():
data = codecs.open('d_data.txt','r',encoding='utf-8')
for name in data:
name = name.strip()
print(name)
下面就是爬取的主体部分了,也不难,就是一个简单的发送请求,接受响应。。。代码如下
import time
import codecs
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
def getInformation(name):
try:
f = open("neww_data.txt", "a+", encoding="utf-8")
global driver
driver = webdriver.Chrome()
driver.get("https://travel.qunar.com/p-cs299914-beijing")
time.sleep(1)
driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div/div[2]/div[1]/div/input").send_keys(name, Keys.ENTER)
driver.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/ul/li[2]/a").click()
driver.find_element(By.XPATH,"/html/body/div[3]/div/div[3]/div[1]/div[1]/div[1]").click()
driver.find_element(By.XPATH, "/html/body/div[3]/div/div[3]/div[1]/div[1]/div[2]/ul/li[1]/a").click()
time.sleep(1)
driver.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/ul/li[1]/div[2]/h2/a').click()
time.sleep(1)
list_windows = driver.window_handles
driver.switch_to.window(list_windows[1])
elem_name = driver.find_element(By.XPATH, "//*[@id='gs']/div[1]/p[1]").text
time.sleep(1)
print(elem_name)
new_data = name+":"+elem_name+"\n"
f.write(new_data)
time.sleep(1)
return
except Exception as e:
print("Error: ", e)
finally:
driver.close()
这就是主体的几十行代码,如果跟我有同样的需求,直接就可以用,但是使用selenium的时候要注意chrome浏览器的对应版本驱动,如果不是最新版或者版本不匹配可以去网上下载,很多的。
'''
'''
下面重新整理下整体的代码:
1.main.py(程序运行这个就可以,负责循环每个关键词然后去调用爬取主函数)
import codecs
import get_entity
def main():
data = codecs.open('d_data.txt','r',encoding='utf-8')
for name in data:
name = name.strip()
print(name)
get_entity.getInformation(name)
print('爬取完成')
source.close()
if __name__ == '__main__':
main()
2.get_entity.py(上面已经提到,爬取部分)
import time
import codecs
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
def getInformation(name):
try:
f = open("neww_data.txt", "a+", encoding="utf-8")
global driver
driver = webdriver.Chrome()
driver.get("https://travel.qunar.com/p-cs299914-beijing")
time.sleep(1)
driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div/div[2]/div[1]/div/input").send_keys(name, Keys.ENTER)
driver.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/ul/li[2]/a").click()
driver.find_element(By.XPATH,"/html/body/div[3]/div/div[3]/div[1]/div[1]/div[1]").click()
driver.find_element(By.XPATH, "/html/body/div[3]/div/div[3]/div[1]/div[1]/div[2]/ul/li[1]/a").click()
time.sleep(1)
driver.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/ul/li[1]/div[2]/h2/a').click()
time.sleep(1)
list_windows = driver.window_handles
driver.switch_to.window(list_windows[1])
elem_name = driver.find_element(By.XPATH, "//*[@id='gs']/div[1]/p[1]").text
time.sleep(1)
print(elem_name)
new_data = name+":"+elem_name+"\n"
f.write(new_data)
time.sleep(1)
return
except Exception as e:
print("Error: ", e)
finally:
driver.close()
把文件1和文件2放到一个文件夹里面,然后再把数据也放进去,就可以直接运行了。