匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python爬虫实战:爬取数据、反爬虫技巧

Python爬虫实战:爬取数据、反爬虫技巧

随着互联网的不断发展,越来越多的数据被放到了网上,这对于数据分析和挖掘提供了非常便利的条件。而爬虫技术,作为获取这些数据的重要手段之一,也越来越受到广泛关注。

本文将介绍如何使用 Python 编写爬虫,并讲解一些常见的反爬虫技巧。

一、爬取数据

1. 准备工作

首先,我们需要安装 Python 和一些必要的库,如 requests、BeautifulSoup、pandas 等。可以使用 pip 直接安装这些库:

```
pip install requests
pip install beautifulsoup4
pip install pandas
```

2. 发送请求

爬虫的第一步是发送请求获取网页源代码。使用 requests.get() 方法可以完成这个操作,代码如下:

```python
import requests

url = 'https://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
print(response.text)
```

上面代码中,我们使用 requests.get() 方法获取了百度首页的源代码,使用 headers 参数设置了请求头信息,避免被服务器拒绝访问。

3. 解析网页

得到网页源代码之后,我们需要从中提取有用的信息。这就需要用到 BeautifulSoup 库了。使用 BeautifulSoup 的 find() 或 findAll() 方法可以获取指定标签的内容。

例如,我们要获取百度首页的标题和搜索框,可以这样写:

```python
from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('title').string
print(title)

searchbox = soup.find('input', {'id': 'kw'})
print(searchbox)
```

上面代码中,我们使用 BeautifulSoup 对源代码进行了解析,并使用 find() 方法获取了网页标题和搜索框的内容。

4. 存储数据

最后一步是将我们爬取到的数据存储到本地。这可以使用 pandas 的 DataFrame 类实现。DataFrame 是一个二维表格,可以存储多个列的数据。

下面是一个简单的例子,我们将爬取到的电影信息存储到一个 CSV 文件中。

```python
import pandas as pd

movies = [['The Shawshank Redemption', 'Tim Robbins, Morgan Freeman, Bob Gunton', '1994'],
          ['The Godfather', 'Marlon Brando, Al Pacino, James Caan', '1972'],
          ['The Dark Knight', 'Christian Bale, Heath Ledger, Aaron Eckhart', '2008']]
df = pd.DataFrame(movies, columns=['name', 'cast', 'year'])
df.to_csv('movies.csv', index=False)
```

上面代码中,我们使用了 pandas 的 DataFrame 类创建了一个包含电影名称、演员和上映年份的表格,然后使用 to_csv() 方法将其存储到 movies.csv 文件中。

二、反爬虫技巧

由于爬虫的存在,一些网站会采取一些措施防止被爬取,例如设置请求头信息、验证码、IP 地址限制等。下面是一些常见的反爬虫技巧。

1. 设置请求头

为了模拟浏览器发送请求,我们需要设置请求头信息。在 requests.get() 方法中,可以使用 headers 参数设置请求头信息,例如:

```python
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
```

上面代码中,我们使用了一个浏览器的请求头信息。在实际使用中,需要根据网站具体情况设置请求头信息。

2. 验证码

有些网站会设置验证码,需要手动输入才能继续爬取。这时可以使用第三方库 pytesseract 和 PIL 库识别验证码。

例如,我们要爬取豆瓣电影 Top250 页面中的验证码,可以这样写:

```python
from PIL import Image
import pytesseract

# 获取验证码图片
captcha_url = 'https://www.douban.com/misc/captcha?id=3RkRQHy2Qr5v7J96dQkZawps:en&size=s'
captcha_res = requests.get(captcha_url)
with open('captcha.png', 'wb') as f:
    f.write(captcha_res.content)

# 识别验证码
captcha_img = Image.open('captcha.png')
captcha_text = pytesseract.image_to_string(captcha_img)
print(captcha_text)
```

上面代码中,我们使用 requests.get() 方法获取了验证码图片,并将其保存到本地。然后使用 pytesseract.image_to_string() 方法识别验证码,得到验证码的文本内容。

3. IP 地址限制

有些网站会限制同一 IP 地址的访问次数。为了避免被禁止访问,我们可以使用代理服务器。

例如,我们可以使用免费的代理服务器访问 Google 首页,代码如下:

```python
# 获取代理服务器
proxy_url = 'https://www.free-proxy-list.net/'
res = requests.get(proxy_url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
proxy_addr = soup.find('tbody').find('tr').find_all('td')[0].string + ':' + soup.find('tbody').find('tr').find_all('td')[1].string

# 设置代理服务器
proxies = {
    'http': 'http://' + proxy_addr,
    'https': 'https://' + proxy_addr
}
response = requests.get('https://www.google.com', proxies=proxies)
print(response.text)
```

上面代码中,我们首先使用 requests.get() 获取免费的代理服务器,然后从网页源代码中解析出代理服务器的 IP 地址和端口号。最后,使用 proxies 参数将代理服务器设置到 requests.get() 方法中即可。

结语

本文介绍了如何使用 Python 编写爬虫,以及一些常见的反爬虫技巧。爬虫技术虽然是获取信息的一种便捷方式,但在使用时需要注意合法性和道德性。