一篇教程,让你从Python基础到高级爬虫 Python,作为一门通用编程语言,自然不会缺少网络编程的支持。与Java和C++相比,Python更易于上手,使得它成为爬虫领域的大热门。本篇教程将带你了解Python的基础知识,并教你如何使用Python进行高级爬虫。 前置知识 在学习本教程之前,你需要了解基础的Python语法和命令行工具的使用方法,如pip安装工具。如果你已经掌握了这些知识,那么就可以开始了。 第一步:基础爬虫 我们先从最基础的爬虫开始,以爬取豆瓣电影为例。请先安装以下需要用到的库: ``` pip install requests pip install beautifulsoup4 ``` 首先,我们需要了解爬虫的基本流程。爬虫的过程是先通过网络获取一个网页的内容,再从网页中获取我们所需要的信息。这个过程通常分为以下几个步骤: 1. 发送HTTP请求,获取网页内容。 2. 解析HTML代码,提取出所需信息。 3. 存储信息。 代码如下: ```python import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/top250' 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) soup = BeautifulSoup(response.text, 'html.parser') film_list = soup.find('ol', class_='grid_view') for film in film_list.find_all('li'): rank = film.find('em').text title = film.find('span', class_='title').text rating = film.find('span', class_='rating_num').text print(rank, title, rating) ``` 以上代码首先定义了目标网址和请求头,通过requests库发起HTTP请求,然后用BeautifulSoup解析HTML代码。接着通过遍历所有电影条目,并从中提取排名、电影名、评分,并输出到控制台。 第二步:反爬虫 在实际的爬虫过程中,网站通常会设置一些反爬虫机制,以尽量防止被恶意爬虫爬取。例如: - 检查用户IP地址。 - 检查请求头中的User-Agent信息是否合法。 - 检查请求频率是否过高。 为了应对这些反爬虫机制,我们需要在代码中加入一些处理逻辑。以下是一些常用方法: 1. 设置headers,模拟浏览器访问。 2. 随机生成User-Agent。 3. 使用代理IP访问。 4. 使用时间间隔控制访问频率。 代码如下: ```python import requests from bs4 import BeautifulSoup import random import time def get_user_agent(): user_agent_list = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko' ] return random.choice(user_agent_list) def request_site(url): headers = {'User-Agent': get_user_agent()} response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: return None def spider_douban(): url = 'https://movie.douban.com/top250' for i in range(10): html = request_site(url) soup = BeautifulSoup(html, 'html.parser') film_list = soup.find('ol', class_='grid_view') for film in film_list.find_all('li'): rank = film.find('em').text title = film.find('span', class_='title').text rating = film.find('span', class_='rating_num').text print(rank, title, rating) time.sleep(random.randint(1,3)) if __name__ == '__main__': spider_douban() ``` 以上代码中,我们定义了一个get_user_agent函数,随机生成User-Agent信息。request_site函数可以自动处理请求失败的情况。spider_douban函数则是一个完整的爬虫流程,加入了时间间隔控制,以防止请求频率过高引发反爬虫机制。 第三步:高级爬虫 有时候,我们需要通过爬虫获取一些特殊的信息。例如,我们需要通过爬虫获取一个网站的所有链接,或者爬取一个网站上的所有图片。以下是一些高级爬虫的案例。 1. 获取所有链接 ```python import requests from bs4 import BeautifulSoup import re url = "https://www.example.com/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") links = [] for link in soup.find_all("a"): href = link.get("href") if href and re.match(r"^https?://", href): links.append(href) ``` 以上代码通过遍历所有a标签,获取href属性,筛选出所有http或https开头的链接,并存储在links列表中。 2. 爬取图片 ```python import requests from bs4 import BeautifulSoup import os url = 'https://www.example.com/' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') img_dir = 'images' if not os.path.exists(img_dir): os.makedirs(img_dir) imgs = soup.find_all('img') for img in imgs: src = img.get('src') if src.startswith('http'): response = requests.get(src) with open(os.path.join(img_dir, os.path.basename(src)), 'wb') as f: f.write(response.content) ``` 以上代码可以从网站上爬取所有的图片,并保存到本地文件夹中。我们首先获取所有的img标签,然后遍历每个标签,通过获取src属性获取图片链接,并使用requests库下载图片内容。 总结 通过本教程,你已经了解了Python的基础知识和一个完整的爬虫流程。同时,你还学习了如何处理反爬虫机制和实现一些高级爬虫功能。祝你在Python的世界里愉快地编程!