Python实战总结——把坑踩遍,让别人无坑可踩(一)

目录

前言

关于“库”

“保持联系”

取出数据

看懂网页

奖励自己第一个爬虫!


(希望想学习的朋友一定把文章看完,相信你终有所得!)

前言

我,是一只爱折腾的鹦鹉,也是一只喜欢将书本知识进行实践的鹦鹉。由于自己兴趣与日后的需要,鹦鹉先生利用了一天半的时间,学习实践了Python爬虫。当然,学习的过程有些坎坷:百度博客文章的博主不是为了装大佬,将语句复杂化,就是将问题严重复杂化,相当不利于学习。更有甚者连基本代码的格式都一塌糊涂,注释一个字都不写。鹦鹉先生一直相信,写代码带注释是最基本、最重要的步骤!不是说我的编程能力有多强,毕竟我也不是软件专业,而是说这些代码对初学者来说相当不友好,但对有基础的人来说也就那样。于是,鹦鹉先生就写下了这篇文章,将爬虫的实战经验总结下来,供大家参考。还是老样子,欢迎大佬请鹦鹉先生喝茶。

一开始,鹦鹉先生是没有想到写爬虫的。鹦鹉先生原本是写了一个TCP的通信小程序(Java),分服务端和客户端,可以将客户端输入的文字传到服务端,类似QQ。后来在研究计算机网络通信的时候,想起了接口调用——把对应参数填好,丢给服务器,服务器就会传回相应结果。再后来,想到了爬虫也具有这一相似点——给你一个目标,就自动爬下我需要的所有东西,这才想到再写一次爬虫。

话说多了,我们再回到今天的Python爬虫。

本篇总结,鹦鹉先生将以:

  • 在篇幅有限的情况下,将所有知识点努力细化;
  • 拒绝白嫖党,自己动手,丰衣足食;
  • 将操作步骤努力细化;
  • 将坑努力踩遍,让大家少走弯路。

为原则,将包含基本知识、操作、编程思路等,为大家献上相对全面的实战总结。

这里再说几句:技术本身没有坏心眼,但加以有心改造,很可能出问题。希望大家将学到的技术造福他人,造福社会,而不是去做损人利己的事情。

下面,我们进入正题。

环境

系统:Windows

Python版本:3.9

编译器:VS Code

浏览器:Edge、Chrome

关于“库”

之所以用Python,就是因为有强大的函数库。相对于其他语言,Python拥有许多相当强大的库,比如后文将提到的requests、bs4等等。善于利用这些库,我们就可以实现很多看似难以实现的功能。安装库也相当容易,使用“pip install (库名)”命令,在控制台输入即可。在下面的代码实践过程中,如果看到编译器提示“找不到该函数库”时,大概率是没安装这个函数库,可尝试“pip”命令解决。安装完成后,关闭编译器重新打开文件即可使新函数库生效。

“保持联系”

想要爬下想要的数据,就需要与服务器取得联系,毕竟我们要的数据都是服务器吐给我们的。所以接下来,我们先来看看如何与服务器取得联系。

最为常用的两种方法就是“Get”和“Post”。两者的区别就是:前者的参数在URL里头,后者要向填一个表单一样提交参数。但在Python实现时,两者差别不大,基本套路都是先准备好URL和参数列表,再交给指定函数即可,剩下的传输之类的就不用管了:

用到了“requests”库,准备好URL和参数后,交给requests下的get或post方法。要想看到服务器返回的数据,使用response.text,把它print出来就可以了:

很好,我们已经学会了和服务器取得联系的方式了!

但是现在很多网站都有反爬措施,如果不是常规浏览器访问,是不会返回数据的。所以,我们要假装自己是一个浏览器,去访问服务器。我们自己手动拼装一个header,里面有浏览器、用户代理等等的信息。header将附在传输到服务器的请求报文中,送达服务器。服务器收到了,以为我们是浏览器,就会吐数据给我们了:

看,吐下来了一堆数据,是不是很爽?至此,我们已经学会了和服务器友好地交流了!

代码汇总:

# get:
import requests
 
url = 'http://'   #目标网址
data = {     #各参数列表(看API网站给了哪些参数)
    'params1':' ',   #name参数赋值
    'params2':' '   #age参数赋值
}
response = requests.get(url, params=data)  #将带参数data的url返回内容保存在response
print(response.url)  #打印url
print(response.text)  #打印返回的内容

# post:
import requests
 
url = 'http://'  #目标网址
data = {   #参数列表
    'params1':' ',
    'params2':' '
    }
response = requests.post(url, data=data)  #将带参数data的url返回内容保存在response
print(response.url)  #打印url
print(response.text)  #打印返回的内容

# headers:
headers = {   #headers制作
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
}
response = requests.get(url, headers=headers)

取出数据

拿上面的知乎举例,要想得到我们想要的数据,去除掉没用的字符,我们就先要把数据取出来,存在一个变量里面,准备处理。于是,我们需要使用bs4的BeautifulSoup库,将上面提到的requests.get/post返回的结果,交给BeautifulSoup,就可以帮我们对数据做一些预处理,方便我们后续取出所需数据:

因为后续我们要用的函数参数类型是html,于是这里用到了lxml解析器,将html结果存到soup里头。

看懂网页

我们爬的是网页(HTML),当然要先看懂网页是由什么部分组成的。所以,我们先来看看京东,输入任意想要的商品,进入结果页面:

按下F12,弹出“开发者工具”侧边栏,点击“元素”:

不要慌,不要怕,这个其实很简单,里头绝大多数都是我们不要的数据。我们只看我们关心的数据,如商品名、价格、店铺名等等,这里就拿价格举例,其他也是一样的。点击红圈的图标,开发者工具就会自动显示鼠标指向的元素的代码:

我们将鼠标指向商品价格,右边的“价格”代码就展开了,并且还高亮显示:

把这一行放大一点:

我们可以看到,价格“24.80”被括在<i>标签,属性是“data-price”的语句中,其外层函数是<div>标签,属性“class”值为“p-price”的语句。

由此,我们可知:

京东的商品价格在<div class=”p-price”>下的<i>标签里头。

于是,我们学会了如何在网页上,精准找到我们想要的数据位置!

关于HTML:

我们学爬虫,还是需要了解一下HTML的,但只需知道大概的框架即可,知道HTML是基于文档对象模型(DOM)的,以树的结构,存储各种标记,比如价格、商品名、店名等等。它的各种标签层次关系如下:

奖励自己第一个爬虫!

很好,我们已经学习了一些基本技能,而这些技能已经足够我们写出第一个爬虫了!下面,我们就开始写出第一个爬虫程序:

将“url”变量替换为想要爬取的商品搜索结果页URL,一个F5键,选择Python文件:

商品价格就源源不断传回来了:

恭喜,你已经写出了一个Python爬虫!

代码汇总:

#库
from bs4 import BeautifulSoup
import requests

#网页地址
url = "https://search.jd.com/Search?keyword=p50pro&enc=utf-8&suggest=5.def.0.SAK7|MIXTAG_SAK7R,SAK7_M_AM_L5370,SAK7_M_COL_L15275,SAK7_S_AM_R,SAK7_SC_PD_L16382,SAK7_SM_PB_R,SAK7_SS_PM_R|G*SAK7_M_COL_L15275&wq=p&pvid=619f02b3c8ee472d80619e90f029e29c"

#headers准备
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 OPR/66.0.3515.115'}

#获取数据
f = requests.get(url, headers=headers)                 #Get该网页从而获取该html内容
soup = BeautifulSoup(f.content, "lxml")  #用lxml解析器解析该网页的内容, 好像f.text也是返回的html
#print(f.content.decode())		#调试用,尝试打印出网页内容,看是否获取成功
#content = soup.find_all('div',class_="p12" )   #尝试获取节点,因为class和关键字冲突,所以改名class_

for k in soup.find_all('div',class_='p-price'):#,找到div并且class为p-price的标签
    a = k.find_all('i')       #在每个对应div标签下找i标签
    print(a[0].string)  #字符串输出


下一篇:Python实战总结——把坑踩遍,让别人无坑可踩(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值