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 编写爬虫,以及一些常见的反爬虫技巧。爬虫技术虽然是获取信息的一种便捷方式,但在使用时需要注意合法性和道德性。