page contents

Python爬虫教程:原理、常用库与实战案例!

Python爬虫是一种自动获取网页内容的程序,其原理是模拟人类用户访问网页的行为,从网页中提取数据并将其存储或进行进一步处理。常用的Python爬虫库有requests、BeautifulSoup和Scrapy等。

attachments-2024-08-Sj5CJNWA66b432088fb75.jpgPython爬虫是一种自动获取网页内容的程序,其原理是模拟人类用户访问网页的行为,从网页中提取数据并将其存储或进行进一步处理。常用的Python爬虫库有requests、BeautifulSoup和Scrapy等。

爬虫介绍与原理

爬虫,又称网络爬虫,是一种自动获取网页内容的程序。它模拟人类浏览网页的行为,发送HTTP请求,获取网页源代码,再通过解析、提取等技术手段,获取所需数据。

爬虫定义:爬虫(Spider),也被称为网络爬虫或网络蜘蛛,是一种自动化程序,用于在互联网上浏览和提取信息。

爬虫工作流程:爬虫通过发送HTTP请求获取网页内容,使用HTML解析器(如Beautiful Soup或正则表达式)解析HTML代码,提取有用的数据,如文本、图片、链接等,并进行处理、清洗和整理,以便后续的存储和分析。

常用爬虫技术与库

请求库:如requests、aiohttp,用于发送HTTP请求。

解析库:如BeautifulSoup、lxml、PyQuery,用于解析网页内容。

存储库:如pandas、SQLite,用于存储爬取到的数据。

异步库:如asyncio、aiohttp,用于实现异步爬虫,提高爬取效率。

python爬虫常用库

1. 请求库

(1)requests:简洁、强大的HTTP库,支持HTTP连接保持和连接池,支持SSL证书验证、Cookies等。

(2)aiohttp:基于asyncio的异步HTTP网络库,适用于需要高并发的爬虫场景。

2. 解析库

(1)BeautifulSoup:一个HTML和XML的解析库,简单易用,支持多种解析器。

(2)lxml:一个高效的XML和HTML解析库,支持XPath和CSS选择器。

(3)PyQuery:一个Python版的jQuery,语法与jQuery类似,易于上手。

3. 存储库

(1)pandas:一个强大的数据分析库,提供数据结构和数据分析工具,支持多种文件格式。

(2)SQLite:一个轻量级的数据库,支持SQL查询,适用于小型爬虫项目。

简单爬虫编写

需求设计:以爬取豆瓣电影TOP250为例,需要爬取的信息包括电影名称、评分、导演等。

代码实现:使用requests库发送HTTP请求,获取网页源代码,使用BeautifulSoup库解析网页内容,提取所需数据,使用pandas库存储数据,并保存为CSV文件。

运行爬虫与展示结果

主函数:在主函数中,遍历豆瓣电影TOP250的各页URL,调用上述函数获取页面内容、解析页面内容和保存数据到CSV文件。

以爬取豆瓣电影TOP250为例,讲解如何编写一个简单的Python爬虫。

设计爬虫需求

爬取豆瓣电影TOP250的电影名称、评分、导演等信息。

编写代码

(1)使用requests库发送HTTP请求,获取网页源代码。

(2)使用BeautifulSoup库解析网页内容,提取所需数据。

(3)使用pandas库存储数据,并保存为CSV文件。

运行爬虫并展示结果

import requests

from bs4 import BeautifulSoup

import pandas as pd

# 豆瓣电影TOP250的基础URL

base_url = 'https://movie.douban.com/top250'

# 定义一个函数来获取页面内容

def get_page_content(url):

    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.3'}

    response = requests.get(url, headers=headers)

    if response.status_code == 200:

        return response.text

    else:

        print('请求页面失败:', response.status_code)

        return None

# 定义一个函数来解析页面内容

def parse_page_content(html):

    soup = BeautifulSoup(html, 'html.parser')

    movie_list = soup.find_all('div', class_='item')

    movies = []

    for movie in movie_list:

        title = movie.find('span', class_='title').get_text()

        rating = movie.find('span', class_='rating_num').get_text()

        director = movie.find('p', class_='').find('a').get_text()

        movies.append({'title': title, 'rating': rating, 'director': director})

    return movies

# 定义一个函数来保存数据到CSV文件

def save_to_csv(movies):

    df = pd.DataFrame(movies)

    df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')

# 主函数,用于运行爬虫

def main():

    movies = []

    for i in range(0, 250, 25):  # 豆瓣电影TOP250分为10页,每页25部电影

        url = f'{base_url}?start={i}&filter='

        html = get_page_content(url)

        if html:

            movies.extend(parse_page_content(html))

    save_to_csv(movies)

    print('爬取完成,数据已保存到douban_top250.csv')

# 运行主函数

if __name__ == '__main__':

    main()

在实际使用中,需要根据豆瓣网站的实际情况调整以下内容:

URL和参数:根据豆瓣电影的URL结构和参数进行设置。

BeautifulSoup选择器:根据网页源代码的结构编写正确的选择器来提取数据。

此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:

遵守Robots协议,不爬取网站禁止爬取的内容。

设置合理的请求间隔,避免对网站服务器造成过大压力。

如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。

使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。

最后,由于网站结构可能会发生变化,上述代码可能需要根据实际情况进行调整。在实际应用中,请确保您的爬虫行为合法合规。

四、爬虫实战案例

以爬取某招聘网站职位信息为例,讲解如何编写一个实用的Python爬虫。

1. 分析网站结构

通过观察招聘网站的URL、参数和页面结构,找到职位信息的来源。

2. 编写爬虫代码

(1)使用requests库发送带参数的HTTP请求,获取职位列表。

(2)使用lxml库解析职位列表,提取职位详情页URL。

(3)使用PyQuery库解析职位详情页,提取职位信息。

(4)使用SQLite数据库存储职位信息。

3. 结果展示与分析

import requests

from lxml import etree

from pyquery import PyQuery as pq

import sqlite3

# 创建或连接SQLite数据库

conn = sqlite3.connect('job.db')

cursor = conn.cursor()

# 创建职位信息表

cursor.execute('CREATE TABLE IF NOT EXISTS job (id INTEGER PRIMARY KEY, title TEXT, salary TEXT, company TEXT, location TEXT)')

# 分析网站结构后得到的职位列表URL

url = 'https://www.example.com/jobs'

# 发送HTTP请求获取职位列表

params = {

    'page': 1,  # 假设页面参数为page,这里请求第1页

    'city': 'beijing'  # 假设城市参数为city,这里请求北京地区的职位

}

response = requests.get(url, params=params)

response.encoding = 'utf-8'  # 设置字符编码,防止乱码

# 使用lxml解析职位列表,提取职位详情页URL

html = etree.HTML(response.text)

job_list = html.xpath('//div[@class="job-list"]/ul/li/a/@href')  # 假设职位详情页URL在a标签的href属性中

# 遍历职位详情页URL,爬取职位信息

for job_url in job_list:

    job_response = requests.get(job_url)

    job_response.encoding = 'utf-8'

    job_html = pq(job_response.text)

    # 使用PyQuery解析职位详情页,提取职位信息

    title = job_html('.job-title').text()  # 假设职位名称在class为job-title的元素中

    salary = job_html('.job-salary').text()  # 假设薪资信息在class为job-salary的元素中

    company = job_html('.job-company').text()  # 假设公司名称在class为job-company的元素中

    location = job_html('.job-location').text()  # 假设工作地点在class为job-location的元素中

    # 存储职位信息到SQLite数据库

    cursor.execute('INSERT INTO job (title, salary, company, location) VALUES (?, ?, ?, ?)', (title, salary, company, location))

    conn.commit()

# 关闭数据库连接

cursor.close()

conn.close()

在实际使用中,需要根据目标网站的实际情况调整以下内容:

URL和参数:根据目标网站的URL结构和参数进行设置。

Xpath表达式:根据网页源代码的结构编写正确的Xpath表达式来提取数据。

PyQuery选择器:根据网页源代码的结构编写正确的CSS选择器来提取数据。

数据库操作:根据需要创建合适的数据库表结构,并插入数据。

此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:

遵守Robots协议,不爬取网站禁止爬取的内容。

设置合理的请求间隔,避免对网站服务器造成过大压力。

如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。

使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。

五、爬虫注意事项与技巧

遵循Robots协议

尊重网站的爬虫协议,避免爬取禁止爬取的内容。

设置合理的请求间隔

避免对目标网站服务器造成过大压力,合理设置请求间隔。

处理反爬虫策略

了解并应对网站的反爬虫策略,如IP封禁、验证码等。

使用代理IP、Cookies等技巧

提高爬虫的稳定性和成功率。

分布式爬虫的搭建与优化

使用Scrapy-Redis等框架,实现分布式爬虫,提高爬取效率。

六、Python爬虫框架

Scrapy:强大的Python爬虫框架,支持分布式爬取、多种数据格式、强大的插件系统等。

Scrapy-Redis:基于Scrapy和Redis的分布式爬虫框架,实现分布式爬取和去重功能。

综上所述,Python爬虫通过模拟人类用户访问网页的行为,利用丰富的库支持来获取、解析和存储网页数据,广泛应用于数据采集和数据分析领域。在实际应用中,需遵循合法合规的原则,确保尊重网站隐私政策和使用条款。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2024-08-08 10:48
  • 阅读 ( 66 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

1470 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章