匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python中的Web爬虫:从入门到高级

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爬虫时,需要遵守法律规定,不得违反网站的规定和道德准则,保护网站的安全和隐私。