Python 爬虫初学者实战

2023-11-17

1. 手写第一个 python 爬虫

# 爬虫: 用程序来获取网站上的资源
# 常用 encoding='utf-8'  encoding='gbk'

# 1. 导入 urllib.request  urlopen
from urllib.request import urlopen

# 2. 设置目标网址,并使用urlopen来访问
# 访问完成是有返回数据的 使用resp来接收
url = 'http://www.baidu.com'
resp = urlopen(url)

# encoding('utf-8') 将字节转换为字符串
# 使用 utf-8 编码格式 还有 gbk 格式
# as 起别名
with open('mybaidu.html', mode='w', encoding='utf-8') as f:
    f.write(resp.read().decode('utf-8'))

print('over')

resp.close() # 关闭 resp  不然多了会出现奇奇怪怪的问题

2. web请求过程剖析

3. HTTP协议

4. requests 第三方库 清华源

# 先下载 requests 第三方包
# pip install requests

# 国内源  清华源
# 临时使用一次
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

# 导入 requests 包
import requests
query = input('输入一个你要搜索的明星:')

url = f'https://www.sogou.com/web?query={query}'
# 在搜索框里面的 url 的请求方式都是 get 方式
# 请求完成都会有返回的数据

# 处理了一个小小的反爬问题
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

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

print(resp)
print(resp.text) # 获取页面源代码

resp.close() # 关闭 resp  不然多了会出现奇奇怪怪的问题

5. pip 切换为清华源(国内镜像源)

# 临时使用一次  将 some-package 切换为包的名字
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
# 设为默认
python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 如果您到 pip 默认源的网络连接较差,临时使用本镜像站来升级 pip:
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

6. 两个爬虫小文件

传参数使用的变量名
get    params
post   data

# request 入门
import requests

url = 'https://fanyi.baidu.com/sug'

s = input('请输入你要翻译的单词!')

dat = {
    'kw': s
}

# 发送数据和参数,会有返回值用 resp 来接收
# 发送 post 请求, 发送的数据必须在字典中,使用data来传递数据
resp = requests.post(url, data=dat)

# 1. 这里不能使用 text 因为会出现乱码的情况
# 2. 直接将数据转换为 JSON 文件 => dict(字典)
print(resp.json())

resp.close() # 关闭 resp  不然多了会出现奇奇怪怪的问题
# request豆瓣
import requests

url = "https://movie.douban.com/j/chart/top_list"

# 优化参数  参数里面有空格(恶心的坑)会获取到一个空列表 []
param = {
    "type": "24",
    "interval_id": "100:90",
    "action": "",
    "start": 0,
    "limit": 20,
}

# 防止反爬  设置请求头 User-Agent
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

# url 和 params 名字一样可以省略(只写一个即可)
# 注意: get 请求 参数是 params    而 post 请求参数是 data
resp = requests.get(url=url, params=param, headers=headers)

# 被反爬了 需要设置 User-Agent
# print(resp.request.headers)

# 查看爬取到的数据
print(resp.json())

resp.close() # 关闭 resp  不然多了会出现奇奇怪怪的问题

第二章 数据解析概述

1.  re解析
2.  bs4解析
3.  xpath解析

7. re解析 使用 正则表达式

元字符: 具有固定含义的特殊符号 常⽤元字符

. 匹配除换⾏符以外的任意字符
\w 匹配字⺟或数字或下划线
\s 匹配任意的空⽩符
\d 匹配数字

^ 匹配字符串的开始
$ 匹配字符串的结尾

[a-zA-Z0-9] 匹配字符组中的字

量词: 控制前⾯的元字符出现的次数

* 重复零次或更多次
+ 重复⼀次或更多次
? 重复零次或⼀次
{n} 重复n次
 {n,} 重复n次或更多次
{n,m} 重复n到m次

贪婪匹配和惰性匹配 (很重要)

 .* 贪婪匹配   竟可能多的去匹配
.*? 惰性匹配   竟可能少的去匹配

8. re模块

# 导入 re 模块, 常用的 finditer方法 返回的是迭代器
import re

# findall 返回符合正则表达式的所有内容
list = re.findall(r'\d+', "我的手机号:1008611, 还有一个是10000")
print(list)

# finditer 常用
# finditer 返回符合正则表达式的所有内容 (返回的是迭代器)
# 要拿到内容 需要使用 .group函数来获取返回的内容
iter = re.finditer(r'\d+', "我的手机号:1008611, 还有一个是10000")
print(iter)

# 只有 finditer 才有 group 方法
for x in iter:
    print(x.group())

# search返回的是Match数据,那数据需要使用.group()
# 只获取第一个数据,获取到后立马返回(不会再找下一个)
s = re.search(r'\d+', "我的手机号:1008611, 还有一个是10000")
print(s.group())  # 1008611

# match 是从头开始匹配,若开头与正则表达式不匹配,则会报错
z = re.match(r'\d+', "1008611, 还有一个是10000")
print(z.group())

# 预加载正则表达式  compile 表示预加载 (可以重复使用)
obj = re.compile(r'\d+')

it = obj.finditer("我的手机号:1008611, 还有一个是10000")
print(it)

for y in it:
    print(y.group())

result = obj.findall('呵呵, 你要还我一个100000000')
print(result)

9. 在 html 中提取所需要的数据

s = """
<div class='jar'><span id='1'>中国联通</span></div>
<div class='jj'><span id='2'>中国电信</span></div>
<div class='aa'><span id='3'>中国移动</span></div>
"""

obj1 = re.compile(r"<div class='(?P<id>.*?)'><span id='.*?'>(?P<xinming>.*?)</span></div>", re.S) # re.S 匹配到换行符

result1 = obj1.finditer(s)

for xx in result1:
    print(xx.group('id'))
    print(xx.group('xinming'))

#  (?P<xinming>.*?)   (?P<里面写名字>)  后续通过属性名字来获取我们所需要的数据

10. 获取豆瓣top250前面的几条数据

# 1.  获取页面源代码 requests
# 2.  提取页面的有效信息  re模块
import requests
import re
# 创造 csv 文件 方便分析数据
import csv

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

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=headers)

# 获取到页面的内容
page_content = resp.text

# 解析数据 (到豆瓣top250源码 分析得来)   re.S 匹配到换行符
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
                 r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?<span '
                 r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
                 r'<span>(?P<num>.*?)</span>', re.S)

# 开始匹配
result = obj.finditer(page_content)

# 创建data.csv文件
f = open('data.csv', mode='w')
# 写入文件
csvwriter = csv.writer(f)

# strip 去除数据前面的空白
for it in result:
    # print(it.group('name'))
    # print(it.group('year').strip())
    # print(it.group('score'))
    # print(it.group('num'))

    # 将数据写入带字典中  groupdict() 返回字典
    dic = it.groupdict()
    # 处理年数据的空白符  strip() 去除头尾的空格
    dic['year'] = dic['year'].strip()
    # 将 数据写入到dat.csv 文件中
    # 注意: writerow()将一个列表全部写入csv的同一行。
    csvwriter.writerow(dic.values())

resp.close()

f.close()
print('over!')
pycharm打开csv文件,csv文件中的中文出现乱码的解决方案

这是因为pycharm中默认设置是以utf-8的编码方式打开文件,而csv的文件正确读取方式是GBK,使用 UTF-8 自然会造成乱码

解决方法为:修改pycharm的默认设置为 GBK 即可。

11. pycharm 安装插件

1.   csv
2.   Translation

12. 获取 电影天堂 的部分下载链接

注意: SyntaxError:Non-UTF-8 code starting with '\xb6' in file E:/.../....py on line 16, but no encoding declared;

解决方法
# coding=utf-8

在第一行加上上面的代码(带 # 号)

# charset 表示使用什么字符集
charset = gbk 或者 utf-8
# coding=utf-8

# 1.  定位到2022年电影热片
# 2.  获取子页面的链接信息
# 3.  请求子页面获取我们需要的下载链接

import requests
import re

domain = "https://www.dytt89.com/"

# verify=False  去掉安全验证
resp = requests.get(domain, verify=False)

# 指定字符集
resp.encoding = 'gbk'

# print(resp.text)

# 设置re模块 预加载
# 获取到 ul 中的 li
obj1 = re.compile(r"2022必看热片.*?<ul>(?P<ul>.*?)</ul>", re.S)

# 获取子页面中href的内容
obj2 = re.compile(r"<a href='(?P<href>.*?)'", re.S)

# 定义第三个正则表达式
obj3 = re.compile(r'◎片  名 (?P<movie>.*?)<br />.*?<td '
                  r'style="WORD-WRAP: break-word" bgcolor="#fdfddf">'
                  r'<a href="(?P<download>.*?)">', re.S)

result1 = obj1.finditer(resp.text)

# 创建一个装 子页面链接的列表
child_href_list = []

for it in result1:
    ul = it.group('ul')

    # print(ul)
    result2 = obj2.finditer(ul)
    for itt in result2:
        # 拼接子页面链接  域名 + 子页面地址
        # 干掉子页面链接的第一个/(右斜杠)
        child_href = domain + itt.group('href').strip("/")
        # print(itt.group('href'))
        # 打印子页面的链接
        # print(child_href)

        # 将子页面的链接全部添加到列表中
        child_href_list.append(child_href)

# 3. 获取子页面的内容
for href in child_href_list:
    child_resp = requests.get(href)
    # 设置字符集
    child_resp.encoding = 'gbk'
    # 打印子页面的信息
    # print(child_resp.text)

    # 子页面中使用obj3的正则来匹配所需要的内容
    result3 = obj3.search(child_resp.text)
    # 打印从子页面提取的信息
    print(result3.group("movie"))
    print(result3.group("download"))

    # 终止循环(这里只获取第一条信息)
    # break

resp.close()

最后

如果对Python感兴趣的话,可以试试我的学习方法以及相关的学习资料

Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python必备开发工具
 

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、Python练习题

检查学习结果。

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

大家拿到脑图后,根据脑图对应的学习路线,做好学习计划制定。根据学习计划的路线来逐步学习,正常情况下2个月以内,再结合文章中资料,就能够很好地掌握Python并实现一些实践功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 爬虫初学者实战 的相关文章

随机推荐

  • 华为od机试 Java 【切割字符串】

    题目 给定一个由小写字母组成的字符串 请找出两个位置 将字符串分为三部分 这三部分的总和应该是相同的 其中每部分的总和是其字符的ASCII码值的总和 注意 这两个位置的字符不包括在这三部分内 如果你找到了这两个位置 请输出它们的位置 如果没
  • 2 关系型数据库是什么?

    目录结构 关系型数据库基本概念 结构化查询语言 数据定义语言 DDL 数据查询语言 Data Query Language DQL 数据操纵语言 Data Manipulation Language DML 数据控制语言 Data Cont
  • Ubuntu 20.04配置FTP服务方法(非匿名登录)

    一共找了三篇比较好的搭建步骤文章 仅供参考 转载一 https blog csdn net J StrawHat article details 110384202 utm medium distribute pc relevant non
  • Qt之QMap基本用法

    QMap
  • mongodb安装

    官网安装 https docs mongodb com manual tutorial install mongodb enterprise on red hat 开源版本 https docs mongodb com manual tut
  • 概率-什么是一阶矩,二阶矩?

    根据S M 罗斯的概率论教程 一阶矩指E X 即数列X的均值称为一阶矩 以此类推 E Xn n 1 称为X的 n阶矩 也就是二阶矩 三阶矩 参考 1 图灵数学 统计学丛书08 概率论基础教程 第7版 美S M 罗斯 郑忠国 译 人民邮电出版
  • KeepChatGPT解决ChatGPT经常中断的问题

    给大家介绍一款ChatGPT畅聊插件 ChatGPT的火热 相信很多人都会学习如何使用 来提升工作效率 在使用ChatGPT的过程中 经常出现下面这些情况 导致聊天中断 需要重新刷新进入 今天介绍一款插件 来自GitHub的KeepChat
  • zynq之petalinux安装和编译

    首先下载petalinux v2015 4 final installer dec run 去xilinx官网或者我的网盘下载http pan baidu com s 1gf11UGr mkdir opt pkg petalinux v20
  • mybatis处理mysql日期格式

    一 常用日期格式 1 DATE 显示格式 yyyy MM dd 时间范围 1000 01 01 到 9999 12 31 2 DATETIME 显示格式 yyyy MM dd HH mm ss 时间范围 1000 01 01 00 00 0
  • 谷歌,前后端Failed to load resource: net::ERR_CERT_AUTHORITY_INVALID

    项目场景 Springboot vue前后端分离 问题描述 谷歌浏览器调试以上条件的前后端分离项目时出现Failed to load resource net ERR CERT AUTHORITY INVALID 记录我出现的问题及解决方法
  • 从浏览器输入网址到显示页面之间发生了什么

    好久没有更博了 最近一直忙于春招实习应聘 似乎有些打乱了我的节奏 我觉得还是应该把重心放在学习和记录上 不管有没有实习或者有没有拿到offer 我都一直stand by 言归正传 当你输入一个网址到页面显示在你眼前到底发生了什么 这其实是个
  • ESP8266 教程3 — 通过TCP组建局域网并通信

    目录 1 ESP8266 的 AP 模式 1 1 查询 ESP8266 的wifi应用模式 1 2 设置 ESP8266 模块的wifi信息 1 3 查询已经接入的设备 2 ESP8266 的Station 模式 2 1 设置ESP8266
  • FusionCompute8.0.0实验(1)CNA及VRM安装

    准备 1 老旧华硕笔记本电脑用于安装CNA 内存8G 硬盘1T 24G固态 i7 4500u 2核4线程 2 USB光驱 电脑上的光驱坏了 CNA不支持U盘安装 5V2A外接适配器 不能用快充 3 ultroISO破解版 4 办公笔记本 1
  • 阿里云服务器包年包月、按量和抢占式实例怎么选?区别是什么?

    阿里云服务器ECS付费类型包年包月 按量付费和抢占式实例有什么区别 包年包月先付费后使用 最低购买一个月时长 平均下来成本较低 按量付费先使用后付费 按小时结算费用 适合短期使用 平均下来费用要比包年包月贵一些 抢占式实例和按量付费相类似
  • 网站前台技术

    一 HTML5 1 历史 2 应用 html5语法 1 标签不区分大小写2 允许属性值不使用引号3 允许部分属性值的属性省略 html标记 带有 lt gt 符号的元素被称为HTML标记 也称为HTML标签或HTML元素 例如 都是HTML
  • Android选择本地视频和照片上传到服务器

    目录 照片photo 将http 本地存放照片数据库电脑ip 端口号 fileaddress png转image 一 后台发送来的数据转换Bitmap的方法 用法 二 将第一针显示出来方法 用法 视频vedio 使用选择器获取的 conte
  • rpm打包流程步骤

    rpm打包流程步骤 一 RPM简介 1 1 优点 1 2 缺点 二 前期准备 三 文件结构 3 1 各文件作用 四 打包步骤及SPEC文件的编辑 4 1 步骤 4 1 1 前期准备 4 1 2 建立相应的文件 4 1 3 将源码包放入SOU
  • 2.微服务架构组件分析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 该系列文章来源于 学习 极客时间 从0开始学习微服务 分享之后笔记载录和读后感 作者胡忠想 微博技术专家 从 2012 年加入微博到现在 从 2012 年加入微博到现在 我
  • blender的下载安装和配置中文环境

    引言 在3D建模和动画设计领域 Blender 作为一款强大且免费的开源软件 一直以优秀的性能和对众多技术的支持赢得了大批用户的喜爱 然而 对于刚接触这款软件的用户而言 其安装和配置过程可能会带来一定困扰 尤其是在设置中文环境方面 因此 本
  • Python 爬虫初学者实战

    1 手写第一个 python 爬虫 爬虫 用程序来获取网站上的资源 常用 encoding utf 8 encoding gbk 1 导入 urllib request urlopen from urllib request import