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

咨询电话:4000806560

《Python爬虫教程》:从入门到优化,带你掌握网络爬虫技术

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爬虫的基本知识和技巧。在实际项目开发中,还需要结合具体任务需求,灵活运用各种爬虫库和技术,才能最大限度地提高开发效率和数据质量。