专栏首页Python进阶之路Python爬虫自动化 帮小姐姐解放双手

Python爬虫自动化 帮小姐姐解放双手

一、前言

项目来源 漂亮学姐因为工作需要,得根据已有的学校名单,采集它们的英文名称,描述,简称有的话也带上。共有 2740 条学校名称数据,一条条去搜索得到结果,然后复制粘贴到表格里,一天下来估计人都傻了。 花几分钟写了个爬虫小程序,帮助小姐姐解放了双手,成功表现了一波,得到了学姐的夸奖,学姐还请我一起喝了 11 月的第一杯奶茶,美滋滋。

二、分析问题

共有 2740 条学校名称数据

在百度百科中搜索清华大学并查看搜索结果

查看网页源代码,可以惊喜的发现,简要描述的数据显目地躺在开头!

经过分析发现,网页结构简单,可以通过构造URL来请求,获取网页源码,然后从中提取出我们想要的数据即可

三、爬虫代码

当当当,下面该我们的爬虫上场了

导入需要用到的库

import requests
import pandas as pd
from random import choice
from lxml import etree
import openpyxl
import logging

基本配置参数

# 日志输出的基本配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
wb = openpyxl.Workbook()    # 创建工作簿对象
sheet = wb.active    # 获取活动的工作表
sheet.append(['学校名称', '中文简称', '学校名称(英文)', '描述', '百度百科链接'])   # 添加第一行列名

# 产生随机请求头用于切换
user_agent = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]

读取数据、爬取网页

# 读取已有的学校名称数据
df = pd.read_excel('学校名称.xlsx')['学校名称']
items = df.values

# 遍历  获取每所学校名称
for item in items:
    try:
        # 随机生成请求头
        headers = {
            'User-Agent':choice(user_agent)
        }
        # 构造url
        url = f'https://baike.baidu.com/item/{item}'
        # 发送请求   获取响应
        rep = requests.get(url, headers=headers)
        # Xpath解析提取数据
        html = etree.HTML(rep.text)
        # 描述
        description = ''.join(html.xpath('/html/head/meta[4]/@content'))
        # 外文名
        en_name = ','.join(html.xpath('//dl[@class="basicInfo-block basicInfo-left"]/dd[2]/text()')).strip()
        # 中文简称  有的话  是在dd[3]标签下
        simple_name = ''.join(html.xpath('//dl[@class="basicInfo-block basicInfo-left"]/dd[3]/text()')).strip()
        sheet.append([item, simple_name, en_name, url])
        logging.info([item, simple_name, en_name, description, url])

    except Exception as e:
        logging.info(e.args)
        pass

# 保存数据
wb.save('成果.xlsx')

运行效果如下:

一共有 2740 页的数据需要请求爬取,为了提高爬取效率,使用多线程。

# -*- coding: UTF-8 -*-
"""
@File    :帮学姐.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import requests
import pandas as pd
from random import choice
from lxml import etree
import openpyxl
import logging
from concurrent.futures import ThreadPoolExecutor
from time import sleep
from random import random

# print(random())
# 日志输出的基本配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['学校名称', '简称', '英文名称', '描述', '百度百科链接', '原始序号'])
df = pd.read_excel('学校名称.xlsx')['学校名称']
items = list(df.values)
# print(items)
# print(items.index('复旦大学'))

user_agent = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]


def get_data(item):
    try:
        # 记录一下它原本的序号
        sort_num = items.index(item)
        # 随机生成请求头
        headers = {
            'User-Agent':choice(user_agent)
        }
        # 构造的url
        url = f'https://baike.baidu.com/item/{item}'
        # 发送请求   获取响应
        rep = requests.get(url, headers=headers)
        sleep(random())
        # Xpath解析提取数据
        html = etree.HTML(rep.text)
        description = ''.join(html.xpath('/html/head/meta[4]/@content'))
        # 外文名
        en_name = ','.join(html.xpath('//dl[@class="basicInfo-block basicInfo-left"]/dd[2]/text()')).strip()
        # 中文简称  有的话  是在dd[3]标签下
        simple_name = ''.join(html.xpath('//dl[@class="basicInfo-block basicInfo-left"]/dd[3]/text()')).strip()
        sheet.append([item, simple_name, en_name, description, url, sort_num])
        logging.info([item, simple_name, en_name, description, url, sort_num])

    except Exception as e:
        logging.info(e.args)
        pass


# 函数调用   开多线程
def run():
    with ThreadPoolExecutor(max_workers=5) as executor:
        executor.map(get_data, items)

    wb.save('成果.xlsx')
    print('===================== 数据成功下载完成 ======================')


run()

运行效果如下:

等程序运行一会儿,数据就全部爬取下来啦。

因为开多线程,爬取的顺序会打乱,再按照学姐给的学校名称的表格里的顺序排列好,就可以交差啦。

# 程序中也记录了它原本的序号   一起写入Excel
sort_num = items.index(item)
import pandas as pd

# 读取数据
df = pd.read_excel('成果.xlsx')
# 按原始序号排序
df1 = df.sort_values(by='原始序号')
# 查看排序后的数据
df1.head(8)

运行效果如下:

作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数字信号处理——绪论总结

    随着信息学科的快速发展,以及大规模集成电路、超大规模集成电路和软件开发引起的计算机学科的飞速发展,自1965年快速傅里叶变换算法提出后,数字信号处理( digi...

    叶庭云
  • Python 简单实现贪吃蛇小游戏

    PyPoice是SDL多媒体库的Python包装模块。它包含Python函数和类,这些类和类允许使用SDL对CDROM、音频和视频输出、键盘、鼠标和操纵杆输入进...

    叶庭云
  • Python爬虫 爬取B站视频弹幕 + 绘制词云

    视频链接:https://www.bilibili.com/video/BV1zE411Y7JY

    叶庭云
  • (csdn)阅读数小程序v1.0

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    xbhog
  • ua池和代理池

    下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件。

    py3study
  • 【宅男宅女们的福音】电影天堂最新电影爬取及搜索脚本

    多线程电影天堂最新资源爬取脚本、电影搜索脚本 PS:方便大家使用写到了HTML中生成表格。 线程可以在脚本里直接改,测试线程为30时IP可能会被限制访问。[...

    Angel_Kitty
  • Python爬虫教程,爬取小说网站

    得到每个分类的页面的链接只有上面箭头指的地方变了下,因此这里使用Python自动生成了分类的链接:

    python学习教程
  • scrapy设置请求池

    版权信息所有者:chenjiabing 如若转载请标明出处:chenjiabing666.github.io6

    爱撒谎的男孩
  • Restful: Spring Boot with Mongodb

    继续之前的dailyReport项目,今天的任务是选择mongogdb作为持久化存储。

    阿杜
  • 网络IO谁更快?Python与Go请求速度对比

    现在,我们可以通过编写Go Worker的方式,将计算和保存的过程保存在本地的redis缓存中,然后使用Celery来调度这些任务。

    abs_zero

扫码关注云+社区

领取腾讯云代金券