近期接触的一个爬虫项目要求从百度百科上爬取中国各个市市长的基础信息和履历等等文本信息,刚拿到手接触项目刚开始最最简单的想法就是使用python的requests库的get()函数从网上获得信息基本步骤就是先从网上爬取全国各个市的名字存到一个csv文件中,然后一个个去调用,第一次尝试去爬取北京市市长数据时,发现获取下来的为一个NoneType使用当部调试,发现获取的代码不是那个网页的源码,打开发现,url改变了。打开发现这是一个百度百科的旋转验证码,去看了一下破解验证码的方式,选转验证码比较复杂。想着使用简单的模拟登录,使用python的selnium库可以做到跟浏览器驱动配合自动打开浏览器自动查询内容,从而避开验证码,刚开始搜索出现了很多问题,首先就是得创建一个浏览器对象
city_name = pd.read_excel('34province city.xlsx')
info_city = pd.DataFrame(city_name)["城市"] # 创建了一个名为 info_city 的 Pandas Series 对象,其中包含从 city_name 数据框中选择的 "城市" 列的数据
result_df = pd.DataFrame(columns=["城市", "市长信息", "市长履历"]) # 创建一个空的数据集
for
# driver = webdriver.Chrome()#创建一个浏览器,弹出画面
driver1 = webdriver.ChromeOptions()
driver1.add_argument("headless")
driver = webdriver.Chrome(options=driver1)#创建一个无头浏览器
之后打开百度网页,获取输入框和搜索按键,随后我发现当我们进入下一个页面时,网页信息不是一次性传输给我们的,所以可能导致我们获得的网页信息为空或者不是我们需要的页面,因此我加入了显示等待直到某个信息加载出来
driver.get("https://www.baidu.com")
input1 = driver.find_element_by_css_selector('#kw')
input1.send_keys(info_city1 + "市长")
button = driver.find_element_by_css_selector("#su")
button.click()
wait = WebDriverWait(driver, 20)
wait.until(ec.presence_of_element_located((By.ID, "content_left")))# 显式等待
这样就可以获得我们需要的网页数据了
通过我们得到的百度百科地址去获取每个人的信息
page_source1 = driver.page_source # 获得页面数据
soup = BeautifulSoup(page_source1, 'lxml')# 用Beautifulsoup解析页面数据
items1 = soup.find('a', class_="cos-link link_ow0j7 _link_lzhxo_55link_ow0j7").get('href') # 获得各个市市长的地址
print(items1)
driver.get(items1)
# wait = WebDriverWait(driver, 10)
# wait.until(ec.presence_of_element_located((By.NAME, "image")))
time.sleep(1)代码进入休眠等待
page_source2 = driver.page_source
soup1 = BeautifulSoup(page_source2, 'lxml')
items2 = soup1.find('meta', property="og:description").get('content')# 获取基本信息
print(items2)
items3 = soup1.find_all('div', class_="para MARK_MODULE")# 获取履历
这样我们就获得了市长的基本信息
在获得数据的时候,发现获取履历时他的数据相当混乱,其中有[ ]以及空格等格式我们将他们去除
for item3 in items3:
if info_city1 in item3.get_text():
cleaned_text = (re.sub(r'\[[^]]*]', '', item3.get_text())).split('\n') # 使用正则表达式删除[],并去除空格
cleaned_city = '\n'.join(line.strip() for line in cleaned_text if line.strip())
print(cleaned_city)
city_info.append(cleaned_city)
city_info_str = '\n'.join(city_info) # 将列表中的元素合并为一个字符串,以换行符分隔
city_data = pd.DataFrame({"城市": [info_city1], "市长信息": [items2], "市长履历": city_info_str})
# 将数据存入DataFrame()格式中
问题:对把数据放入csv文件中相当不熟悉,对于数据使用panda库中pd.DataFrame()将数据变得美观工整,对于显示等待问题没有弄明白啊,获取显性等待仍然出现问题。碰到except数据使用continue继续运行
改正:在向网页请求获取数据时不能短时间太多次,写代码时尽可能将代码放在不同的function.这样可以更好的给别人看,尽可能将代码分开使用。