defgetText(city,url,text): #因为有可能当年地方《政府工作报告》的没有存在于该网站,所以首先判断网页是否访问错误 #当正常访问时 try: driver.get(url) driver.implicitly_wait(20) soup = BeautifulSoup(driver.page_source, "html5lib") if soup: # 通过BeautifulSoup网页 获取报告 if soup.find(class_='content').find_all('p'): # 将报告储存在content中 content = soup.find(class_='content').find_all('p'
) for i in content: text = text + (str(i.text).strip()) else: text = '文本丢失' #当访问不正常时 except: saveText(city,text) return
defsaveText(city,text): #创建并打开example.csv文件,并将从网页上解析出来的内容储存到这个csv文件中 with open('example.csv', 'a+', newline='', encoding='utf-8') as file: csv_f = csv.writer(file) csv_f.writerow([city, text]) file.close()
4. 创建一个主代码块执行上述代码
当然,
if __name__ == '__main__':
代码块的使用并非必需,但它的确有助于增强代码的模块化和独立性。当你在一个 Python 文件中定义函数和类时,该文件既可以作为模块被其他文件导入使用,也可以作为脚本直接运行。
if __name__ == '__main__': #使用Microsoft浏览器 with open('example1.csv', 'w+', newline='', encoding='utf-8') as file: csv_f = csv.writer(file) csv_f.writerow(['城市','政府工作报告报告']) file.close() driver = webdriver.Edge() #使用Mac的同学直接将此处的.Edge()改为.Safari()即可,即是driver = webdriver.Safari() url = "http://district.ce.cn/zt/2023/zfgzbg/index.shtml"#目标网页 driver.get(url) driver.implicitly_wait(20) #通过BeautifulSoup获取各省市报告的标签 soup = BeautifulSoup(driver.page_source, "html5lib") urlList = soup.find(class_='con').find_all('a') #建立一个空列表,储存获取的省市名和对应的标签 list = [] for i in urlList: list.append([i['title'],i['href']]) #循环列表,通过网址访问各省市报告网页 for i in list: txt = '' getText(i[0],i[1],txt)
5. 总结
5.1 完整代码
import csv from selenium import from bs4 import BeautifulSoup
defgetText(city,url,text):
#当正常访问时 try: driver.get(url) driver.implicitly_wait(20) soup = BeautifulSoup(driver.page_source, "html5lib") if soup: # 通过BeautifulSoup网页 获取报告 if soup.find(class_='content').find_all('p'): # 将报告储存在content中 content = soup.find(class_='content').find_all('p') for i in content: text = text + (str(i.text).strip()) else: text = '文本丢失' #当访问不正常时 except: saveText(city,text) return
#拼接完整的网址,访问下一页 index = url.rfind('/') + 1 getText(city,url[:index] + nextPageUrl, text)
defsaveText(city,text): with open('example.csv', 'a+', newline='', encoding='utf-8') as file: csv_f = csv.writer(file) csv_f.writerow([city, text]) file.close()
if __name__ == '__main__': #使用Microsoft浏览器 with open('example1.csv', 'w+', newline='', encoding='utf-8') as file: csv_f = csv.writer(file) csv_f.writerow(['城市','政府工作报告报告']) file.close() driver = webdriver.Edge() url = "http://district.ce.cn/zt/2023/zfgzbg/index.shtml"#目标网页 driver.get(url) driver.implicitly_wait(20) soup = BeautifulSoup(driver.page_source, "html5lib") urlList = soup.find(class_='con').find_all('a') list = [] for i in urlList: list.append([i['title'],i['href']]) for i in list: txt = '' getText(i[0],i[1],txt)
5.2 爬取结果示例
6. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh 爬虫, m
安装最新版
lianxh
命令:
ssc install lianxh, replace