一、爬蟲原理
網絡爬蟲是一種用于自動獲取網頁內容的程序。它模擬用戶瀏覽網頁的過程,通過發送HTTP請求獲取網頁的源代碼,并利用解析和提取技術來獲取所需的數據。
1. HTTP請求與響應過程
爬蟲向目標網站發送HTTP請求,請求包含URL、請求方法(如GET或POST)、請求頭(Headers)等。服務器接收到請求后,會返回HTTP響應,其中包含狀態碼、響應頭和響應體(網頁內容)。
2. 常用爬蟲技術
- 請求庫:例如
requests
和aiohttp
,用于發送HTTP請求。 - 解析庫:例如
BeautifulSoup
、lxml
和PyQuery
,用于解析網頁內容。 - 存儲庫:例如
pandas
和SQLite
,用于存儲爬取的數據。 - 異步庫:例如
asyncio
和aiohttp
,用于實現異步爬蟲,提高爬取效率。
二、Python爬蟲常用庫
1. 請求庫
- requests:一個簡潔而強大的HTTP庫,支持HTTP連接保持和連接池、SSL證書驗證、Cookies等。
- aiohttp:一個基于asyncio的異步HTTP庫,適合高并發的爬蟲場景。
2. 解析庫
- BeautifulSoup:一個用于解析HTML和XML的庫,簡單易用,支持多種解析器。
- lxml:一個高效的XML和HTML解析庫,支持XPath和CSS選擇器。
- PyQuery:一個Python版的jQuery,語法與jQuery類似,易于上手。
3. 存儲庫
- pandas:一個強大的數據分析庫,提供數據結構和數據分析工具,支持多種文件格式。
- SQLite:一個輕量級的數據庫,支持SQL查詢,適用于小型爬蟲項目。
接下來,將通過7個Python爬蟲的小案例,幫助大家更好地學習和理解Python爬蟲的基礎知識。以下是每個案例的簡介和源代碼:
案例1:爬取豆瓣電影Top250
這個案例使用BeautifulSoup
庫爬取豆瓣電影Top250的電影名稱、評分和評價人數等信息,并將這些信息保存到CSV文件中。
import requests
from bs4 import BeautifulSoup
import csv# 請求URL
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.36'
}# 解析頁面函數
def parse_html(html):soup = BeautifulSoup(html, 'lxml')movie_list = soup.find('ol', class_='grid_view').find_all('li')for movie in movie_list:title = movie.find('div', class_='hd').find('span', class_='title').get_text()rating_num = movie.find('div', class_='star').find('span', class_='rating_num').get_text()comment_num = movie.find('div', class_='star').find_all('span')[-1].get_text()writer.writerow([title, rating_num, comment_num])# 保存數據函數
def save_data():f = open('douban_movie_top250.csv', 'a', newline='', encoding='utf-8-sig')global writerwriter = csv.writer(f)writer.writerow(['電影名稱', '評分', '評價人數'])for i in range(10):url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='response = requests.get(url, headers=headers)parse_html(response.text)f.close()if __name__ == '__main__':save_data()
案例2:爬取貓眼電影Top100
這個案例使用正則表達式和requests
庫爬取貓眼電影Top100的電影名稱、主演和上映時間等信息,并將這些信息保存到TXT文件中。
import requests
import re# 請求URL
url = 'https://maoyan.com/board/4'
# 請求頭部
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.36'
}# 解析頁面函數
def parse_html(html):pattern = re.compile('<p class="name"><a href=".*?" title="(.*?)" data-act="boarditem-click" data-val="{movieId:\\\\d+}">(.*?)</a></p>.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', re.S)items = re.findall(pattern, html)for item in items:yield {'電影名稱': item[1],'主演': item[2].strip(),'上映時間': item[3]}# 保存數據函數
def save_data():f = open('maoyan_top100.txt', 'w', encoding='utf-8')for i in range(10):url = 'https://maoyan.com/board/4?offset=' + str(i * 10)response = requests.get(url, headers=headers)for item in parse_html(response.text):f.write(str(item) + '\n')f.close()if __name__ == '__main__':save_data()
案例3:爬取全國高校名單
這個案例使用正則表達式和requests
庫爬取全國高校名單,并將這些信息保存到TXT文件中。
import requests
import re# 請求URL
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
# 請求頭部
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.36'
}# 解析頁面函數
def parse_html(html):pattern = re.compile('<tr class="alt">.*?<td>(.*?)</td>.*?<td><div align="left">.*?<a href="(.*?)" target="_blank">(.*?)</a></div></td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?</tr>', re.S)items = re.findall(pattern, html)for item in items:yield {'排名': item[0],'學校名稱': item[2],'省市': item[3],'總分': item[4]}# 保存數據函數
def save_data():f = open('university_top100.txt', 'w', encoding='utf-8')response = requests.get(url, headers=headers)for item in parse_html(response.text):f.write(str(item) + '\n')f.close()if __name__ == '__main__':save_data()