Python爬虫教程:从入门到优化,带你掌握网络爬虫技术 网络爬虫,顾名思义,就是一种自动化程序,通过模拟人类对网站进行访问,解析网页内容并抽取有用的数据。近几年,随着大数据时代的到来,以及人工智能技术的不断进步,网络爬虫已成为不少公司和个人必备的工具之一。而Python语言由于其简单易学、功能强大、拥有众多第三方库等特点,也成为了热门的网络爬虫开发语言。 本文将从入门、实战、优化三个方面,带领读者一步步掌握Python爬虫技术。 一、入门篇 1. 爬虫流程 在开始学习Python爬虫前,我们先来看一下典型的爬虫流程: 1. 发送HTTP请求获取网页源代码 2. 解析HTML源代码,提取有用的信息 3. 存储数据 4. 可选:页面翻页、动态加载的处理 2. 常用库介绍 Python语言有很多优秀的爬虫库,以下是一些常用的: 1. requests:用于发送HTTP请求 2. BeautifulSoup4:用于解析HTML和XML文档 3. lxml:用于解析HTML和XML文档 4. Scrapy:Python开发的高度定制化的Web爬虫框架 5. Selenium:用于模拟浏览器操作,处理JavaScript渲染的数据 3. 网络请求 发送请求是爬虫的第一步,requests库是一个常用的网络请求库,以下是一个简单的示例代码: ```python import requests url = "http://www.baidu.com" response = requests.get(url) print(response.text) ``` 4. 解析HTML 网页代码的解析是爬虫的关键步骤之一,BeautifulSoup和lxml是常用的解析HTML和XML文档的库,以下是一个示例代码: ```python from bs4 import BeautifulSoup import requests url = "http://www.baidu.com" response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') print(soup.title.string) ``` 5. 存储数据 爬虫的目的是获取数据,存储数据是必不可少的一步,Python语言可以使用多种方式存储数据,例如:MySQL数据库、MongoDB数据库、CSV文件、JSON文件等。 二、实战篇 1. 爬取猫眼电影TOP100 猫眼电影是国内著名的电影信息平台,其TOP100排行榜是电影爱好者必看的资源之一。以下是一个简单的示例代码,使用requests和BeautifulSoup库爬取猫眼电影TOP100的电影名、主演和上映时间等信息。 ```python import requests from bs4 import BeautifulSoup url = "https://maoyan.com/top100" response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') movies_list = soup.select('.movie-item') for movie in movies_list: name = movie.select('.movie-item-title')[0].text actors = movie.select('.movie-item-info > .star')[0].text.strip() release_time = movie.select('.movie-item-info > .releasetime')[0].text print(name, actors, release_time) ``` 2. 爬取知乎用户信息 知乎是国内知名的社交问答平台,下面是一个简单的示例代码,使用requests和BeautifulSoup库爬取知乎用户的姓名、性别、职业、关注数以及被关注数等信息。 ```python import requests from bs4 import BeautifulSoup url = "https://www.zhihu.com/people/excited-vczh" response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') name = soup.select('.ProfileHeader-name')[0].text gender = soup.select('.Icon--gender')[0]['class'][1] job = soup.select('.ProfileHeader-infoItem')[0].text following = soup.select('.NumberBoard-itemValue')[0].text followers = soup.select('.NumberBoard-itemValue')[1].text print(name, gender, job, following, followers) ``` 三、优化篇 1. 多线程 在爬取大量数据时,单线程效率往往不高,在Python语言中可以通过多线程的方式提高爬虫的效率,以下是一个简单的示例代码: ```python import requests from bs4 import BeautifulSoup from concurrent.futures import ThreadPoolExecutor urls = ["https://maoyan.com/top100", "https://www.zhihu.com/people/excited-vczh"] def get_movie_info(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') movies_list = soup.select('.movie-item') for movie in movies_list: name = movie.select('.movie-item-title')[0].text actors = movie.select('.movie-item-info > .star')[0].text.strip() release_time = movie.select('.movie-item-info > .releasetime')[0].text print(name, actors, release_time) def get_user_info(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') name = soup.select('.ProfileHeader-name')[0].text gender = soup.select('.Icon--gender')[0]['class'][1] job = soup.select('.ProfileHeader-infoItem')[0].text following = soup.select('.NumberBoard-itemValue')[0].text followers = soup.select('.NumberBoard-itemValue')[1].text print(name, gender, job, following, followers) with ThreadPoolExecutor(max_workers=2) as executor: executor.submit(get_movie_info, urls[0]) executor.submit(get_user_info, urls[1]) ``` 2. 页面翻页 在爬取数据时,如果需要翻页访问,可以使用循环来实现。以下是一个示例代码,使用requests和BeautifulSoup库爬取GitHub上的Python项目信息,包括项目名称、所属用户、星级、语言以及项目描述等信息。 ```python import requests from bs4 import BeautifulSoup url = "https://github.com/search?l=Python&p=1&q=python&type=Repositories" for page in range(1, 6): url = "https://github.com/search?l=Python&p={}&q=python&type=Repositories".format(page) response = requests.get(url) soup = BeautifulSoup(response.text, 'lxml') projects_list = soup.select('.repo-list-item') for project in projects_list: name = project.select('.v-align-middle')[0].text.strip() user = project.select('.v-align-middle > .mr-3')[0]['href'].split('/')[-2] stars = project.select('.octicon-star')[0].parent.text.strip() language = project.select('.repo-language-color + span')[0].text.strip() description = project.select('.mb-1')[0].text.strip() print(name, user, stars, language, description) ``` 总结 Python爬虫技术是一项十分实用的技能。通过入门篇、实战篇以及优化篇的学习,相信读者已经初步掌握了Python爬虫的基本知识和技巧。在实际项目开发中,还需要结合具体任务需求,灵活运用各种爬虫库和技术,才能最大限度地提高开发效率和数据质量。