一篇教程,让你从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的世界里愉快地编程!