运用pycharm使用Selenium模拟浏览器访问12306网站,爬取车票相关信息并将获取到的信息存储到本地数据库中。 要求:起始站、终点站、时间不限,至少获取10条车票相关信息,每条信息必须包含车次、时间、剩余座位。
时间: 2024-12-22 07:26:05 浏览: 23
在PyCharm中使用Selenium库模拟浏览器访问12306网站并抓取车票信息,通常需要经过以下步骤:
1. **安装依赖**:
- 安装Python环境(如果尚未安装)
- 打开PyCharm,创建新项目,然后通过`pip install selenium` 和 `pip install webdriver_manager` 安装Selenium和对应的WebDriver(如ChromeDriver或FirefoxDriver)
2. **设置WebDriver**:
- 下载对应浏览器的WebDriver(可以从ChromeDriver或FirefoxDriver官网下载),将它们放到项目的某个目录下,并在代码中指定路径。
3. **初始化Selenium**:
```python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 使用Service类来处理浏览器驱动的路径
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
```
4. **打开12306页面**:
```python
driver.get("https://www.12306.cn/")
```
5. **定位元素并爬取数据**:
- 由于12306的网页结构可能会有所变化,需要找到车票信息的HTML标签。这通常涉及到使用CSS选择器或XPath表达式来定位元素。例如,假设车次、时间、剩余座位分别在`<div class="train-info">`等位置,可以这样获取:
```python
train_info_elements = driver.find_elements_by_css_selector(".train-info")
```
6. **解析并存储数据**:
- 对每个`train_info`元素提取所需信息,然后将其添加到列表或字典中。
```python
tickets_data = []
for info in train_info_elements[:10]: # 获取前10条
# 提取车次、时间、剩余座位
train_no = info.find_element_by_css_selector(".train-no").text
departure_time = info.find_element_by_css_selector(".departure-time").text
remaining_seats = info.find_element_by_css_selector(".remaining-seats").text
ticket_info = {"车次": train_no, "时间": departure_time, "剩余座位": remaining_seats}
tickets_data.append(ticket_info)
```
7. **保存到数据库**:
- 需要一个数据库连接,比如SQLite、MySQL或PostgreSQL。使用相应的库(如sqlite3、pymysql等)将数据插入数据库。这里仅示例如何使用SQLite:
```python
import sqlite3
conn = sqlite3.connect("train_tickets.db") # 创建数据库连接
cursor = conn.cursor()
# 创建表(如果不存在)
cursor.execute('''CREATE TABLE IF NOT EXISTS TrainTickets
(TrainNo TEXT, DepartureTime TEXT, RemainingSeats TEXT)''')
# 插入数据
for data in tickets_data:
cursor.execute("INSERT INTO TrainTickets VALUES (?, ?, ?)", tuple(data.values()))
# 提交事务并关闭连接
conn.commit()
conn.close()
```
8. **结束会话**:
```python
driver.quit()
```
请注意,实际操作中可能需要处理网络请求限制、登录验证以及页面加载等问题。同时,频繁爬取敏感网站可能会触发反爬机制,务必遵守网站的使用政策。
阅读全文