Python中的Web爬虫:从入门到高级
Web爬虫是指通过编写程序,模拟人的行为进行网站数据的自动抓取和处理。在数据分析、机器学习、搜索引擎优化等领域中,Web爬虫是不可或缺的工具。本文将从入门到高级介绍Python中的Web爬虫技术。
一、入门篇
1.1 安装Python
Web爬虫的开发语言可以是多种,但是Python由于其简单易学、强大的第三方库支持和活跃的社区等原因,成为了Web爬虫的首选语言。因此,首先需要在本地安装Python。
Python的官方下载地址为:https://www.python.org/downloads/。根据自己的操作系统下载对应版本的Python并安装。
1.2 获取网页内容
要实现Web爬虫,首先需要获取网页的内容。Python中常用的获取Web页面内容的方法是使用requests库发送HTTP请求,并用BeautifulSoup库解析HTML内容。
下面是一个简单的Python程序,用于获取知乎首页的HTML内容。
```python
import requests
from bs4 import BeautifulSoup
url = 'https://www.zhihu.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())
```
在这个程序中,首先使用requests库发送HTTP GET请求,获取知乎首页的HTML内容。接着,使用BeautifulSoup库解析HTML内容,并将其打印出来。其中,`soup.prettify()`方法将HTML内容以缩进的形式打印出来,易于查看。
1.3 解析HTML内容
获取HTML内容后,需要对其进行解析和处理。通常情况下,需要从HTML中提取出所需要的信息,并将其保存到本地或者数据库中。
Python中常用的HTML解析库是BeautifulSoup。BeautifulSoup可以处理不规则的HTML格式,并且提供了简单易用的API,方便开发者进行信息抽取。
下面是一个简单的Python程序,用于从知乎首页中抽取热门话题标题和链接,并将其保存到CSV文件中。
```python
import requests
from bs4 import BeautifulSoup
import csv
url = 'https://www.zhihu.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
with open('zhihu_hot.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Title', 'Link'])
for item in soup.find_all('a', class_='HotItem-title'):
title = item.get_text()
link = item['href']
writer.writerow([title, link])
```
在这个程序中,首先使用requests库发送HTTP GET请求,获取知乎首页的HTML内容。接着,使用BeautifulSoup库解析HTML内容,并使用csv库将热门话题标题和链接保存到CSV文件中。
1.4 简单爬虫示例
接下来,让我们尝试使用Python实现一个简单的爬虫,抓取京东商城上的商品信息。
首先,我们需要打开浏览器,进入京东商城的首页,按下F12键打开开发者工具,切换到“Network”选项卡,将浏览器切换到“列表页”,翻页几次观察HTTP请求和响应,找出获取商品信息的API接口。
可以发现,获取商品信息的API接口为:`https://search.jd.com/Search`,请求方式为GET,参数包括`keyword`(关键词)、`enc`、`page`(页码)、`s`(排序方式)等。
使用Python代码模拟发送HTTP请求,获取商品信息。代码如下:
```python
import requests
import re
def get_products(keyword, page):
url = 'https://search.jd.com/Search'
params = {
'keyword': keyword,
'enc': 'utf-8',
'page': page,
's': '26',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
}
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
html = response.text
pattern = re.compile(r'
.*?.*?.*?(.*?)
.*?', re.S)
items = re.findall(pattern, html)
for item in items:
sku = item[0]
name = item[1].strip()
print(sku, name)
if __name__ == '__main__':
keyword = input('请输入搜索关键词:')
for page in range(1, 6):
print(f'正在爬取第{page}页,请稍后...')
get_products(keyword, page)
```
在这个程序中,首先定义了一个`get_products`函数,用于获取指定关键词和页码的商品信息。使用requests库发送HTTP GET请求,获取京东搜索结果页面的HTML内容。接着,使用正则表达式从HTML内容中提取出商品的SKU和名称,并打印出来。最后,使用input函数获取搜索关键词,并循环调用`get_products`函数,爬取前5页的商品信息。
二、进阶篇
2.1 使用Selenium模拟浏览器
有时候,我们需要抓取动态网页的数据,如淘宝、天猫等电商网站。这些网站采用了Ajax技术,通过JavaScript实现了页面的动态加载。此时,使用requests库获取的HTML内容只包含部分数据,无法获取全部数据。
为了解决这个问题,可以使用Selenium模拟浏览器,完全加载完整个HTML页面,再进行页面解析。Selenium是一款自动化测试工具,可以模拟人的行为,如点击、输入、滚动等,并且支持多种浏览器。
下面是一个简单的Python程序,用于获取淘宝的搜索结果页面。
```python
import time
from selenium import webdriver
url = 'https://www.taobao.com/'
keyword = input('请输入搜索关键词:')
driver = webdriver.Chrome()
driver.get(url)
search_box = driver.find_element_by_id('q')
search_box.send_keys(keyword)
search_button = driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
search_button.click()
time.sleep(5)
print(driver.page_source)
driver.quit()
```
在这个程序中,首先使用Selenium模拟打开淘宝首页,并输入搜索关键词。接着,通过XPath查找搜索按钮,并模拟点击。使用`time.sleep()`函数等待页面加载完成后,打印出完整的HTML内容,并关闭浏览器。
2.2 使用代理IP
在一些网站上,频繁爬取数据容易被封IP,从而导致不能正常抓取数据。为了避免这个问题,可以使用代理IP实现轮流访问网站,以减少被封IP的风险。
下面是一个简单的Python程序,使用代理IP访问百度。
```python
import requests
proxy = {
'http': 'http://127.0.0.1:8888', # HTTP代理IP和端口号
'https': 'https://127.0.0.1:8888', # HTTPS代理IP和端口号
}
url = 'https://www.baidu.com/'
response = requests.get(url, proxies=proxy)
print(response.text)
```
在这个程序中,使用requests库发送HTTP GET请求,通过`proxies`参数设置代理IP和端口号。如果代理IP不需要身份验证,可以直接设置代理IP和端口号;如果代理IP需要身份验证,可以设置`auth`参数,并传递用户名和密码。
2.3 使用多线程/协程加速爬虫
当需要抓取大量数据时,爬虫效率就成为了一个很大的问题。通过使用多线程或协程,可以充分利用CPU和网络带宽资源,从而提高爬虫的效率。
Python中有多种多线程/协程库可供选择,如threading库、multiprocessing库、gevent库等。这里以gevent库为例,介绍如何使用协程实现爬虫批量下载图片。
```python
import os
import requests
from gevent import monkey
import gevent
monkey.patch_all()
def download_image(url, filename):
response = requests.get(url)
with open(filename, 'wb') as f:
f.write(response.content)
if __name__ == '__main__':
urls = [
'https://img1.bdstatic.com/static/common/widget/top_search_box/logo/home_white.png',
'https://img1.bdstatic.com/static/common/widget/top_search_box/logo/global_white.png',
'https://img0.bdstatic.com/static/common/widget/top_search_box/logo/sug_bd.png',
]
filenames = ['baidu_home.png', 'baidu_global.png', 'baidu_sug.png']
jobs = []
for i in range(len(urls)):
jobs.append(gevent.spawn(download_image, urls[i], filenames[i]))
gevent.joinall(jobs)
print('All images have been downloaded.')
```
在这个程序中,首先定义了一个`download_image`函数,用于下载指定URL的图片,并保存到本地文件中。使用`os`库创建文件夹,并使用`gevent`库从指定URL列表中并发下载图片。
3. 总结
本文从Python的入门到进阶,详细介绍了Web爬虫的技术知识点和应用方法。Web爬虫是一项强大的技术,可以帮助我们抓取并处理大量的网站数据,从而为数据分析、机器学习等领域提供基础支撑。在使用Web爬虫时,需要遵守法律规定,不得违反网站的规定和道德准则,保护网站的安全和隐私。