网页抓取与本地文件处理技术详解
立即解锁
发布时间: 2025-09-03 01:43:59 阅读量: 3 订阅数: 13 AIGC 

### 网页抓取与本地文件处理技术详解
#### 1. 无头浏览器操作与网页截图
在网页操作中,有时我们需要在不显示页面的情况下进行操作,比如获取网页截图。可以使用以下代码实现:
```python
chrome_options.add_argument("--headless")
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('https://httpbin.org/forms/post')
browser.save_screenshot('screenshot.png')
```
上述代码中,`--headless` 参数让浏览器以无头模式运行,即不显示界面。然后使用 `get` 方法打开指定网页,最后通过 `save_screenshot` 方法保存网页截图。
#### 2. 访问密码保护页面
有些网页采用基本的 HTTP 认证进行保护,我们可以使用 `requests` 库来测试这种认证方式。以下是具体操作步骤:
1. 导入 `requests` 库:
```python
import requests
```
2. 使用正确的凭证发送 GET 请求:
```python
requests.get('https://httpbin.org/basic-auth/user/psswd', auth=('user', 'psswd'))
```
此时会返回状态码 200,表示请求成功。
3. 使用错误的凭证发送 GET 请求:
```python
requests.get('https://httpbin.org/basic-auth/user/psswd', auth=('user', 'wrong'))
```
会返回状态码 401,表示未授权。
4. 也可以将凭证直接作为 URL 的一部分传递:
```python
requests.get('https://user:[email protected]/basic-auth/user/psswd')
requests.get('https://user:[email protected]/basic-auth/user/psswd')
```
同样,正确的凭证会返回 200,错误的凭证返回 401。
为了更方便地访问多个需要认证的页面,可以创建一个会话并设置认证参数:
```python
s = requests.Session()
s.auth = ('user', 'psswd')
s.get('https://httpbin.org/basic-auth/user/psswd')
```
#### 3. 加速网页抓取
网页抓取过程中,大部分时间都花在等待服务器响应上。为了提高效率,可以使用 Python 3 的 `futures` 功能并行下载多个页面。以下是具体步骤:
1. 准备工作:
- 从 GitHub 仓库下载示例代码:https://github.com/PacktPublishing/Python-Automation-Cookbook-Second-Edition/tree/master/Chapter03/test_site
- 运行脚本:
```bash
python simple_delay_server.py -d 2
```
该脚本会启动一个故意设置为慢速的服务器,模拟不良网络连接。
2. 编写 `speed_up_step1.py` 脚本:
```python
def process_link(source_link, text):
...
return source_link, get_links(parsed_source, page)
def main(base_url, to_search, workers):
checked_links = set()
to_check = [base_url]
max_checks = 10
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
while to_check:
futures = [executor.submit(process_link, url, to_search) for url in to_check]
to_check = []
for data in concurrent.futures.as_completed(futures):
link, new_links = data.result()
checked_links.add(link)
for link in new_links:
if link not in checked_links and link not in to_check:
to_check.append(link)
max_checks -= 1
if not max_checks:
return
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-w', type=int, help='Number of workers', default=4)
args = parser.parse_args()
main(args.u, args.p, args.w)
```
3. 运行不同数量的工作线程进行测试:
- 运行 `crawling_web_step1.py` 脚本获取时间基线:
```bash
time python crawling_web_step1.py http://localhost:8000/
```
- 运行 `speed_up_step1.py` 脚本,设置不同数量的工作线程:
```bash
time python speed_up_step1.py -w 1
time python speed_up_step1.py -w 2
time python speed_up_step1.py -w 5
```
通过测试可以发现,适当增加工作线程数量可以显著减少抓取时间,但过多的工作线程可能会因为管理开销增加而导致效率下降。
#### 4. 目录递归搜索文件
在处理本地文件时,首先需要找到所需的文件。可以使用 `os.walk` 函数递归搜索目录。以下是具体操作步骤:
1.
0
0
复制全文
相关推荐










