Python 数据获取(一)—— request模块、变量使用与传参方式

一、 页面渲染

服务端渲染:

  • 服务器端将数据和html整合到一起,统一返回给浏览器
  • 页面源代码中能看到数据,直接、简单
  • 数据通常没什么格式,需要想办法匹配

客户端渲染:

  • 第一次只请求一个html骨架,随着输入操作等在后续请求获取数据,进行展示
  • 页面源代码不能看到数据,需要第二次请求,需要抓包分析
  • 数据通常是json或者固定格式的,处理方便

所以本质上,两种渲染方式对爬取各有优劣。

二、 headers处理

       这个headers指的是html的头信息,这部分信息是给浏览器看的。打开一个网页,例如x瓣电影。按 F12抓包,刷新一下页面,这个headers部分就是了。

       我们下面就要用到这个User-Agent,它表示这个请求来自哪里,图中蓝框表示来自浏览器。很多网页最基础的一个反爬方法就是判断你的User-Agent是什么,如果来自程序,就拦截不给返回。

    例如我们来请求一下上面的页面。

import requests

url="https://movie.douban.com/top250"
resp = requests.get(url=url)
print(resp.text)

返回结果为空,说明请求被拦截了

这里我们先看看代码的请求头是什么样的?

import requests

url="https://movie.douban.com/top250"
resp = requests.get(url=url)
# resp.request表示发出的请求,再.headers表示这个请求的headers信息
print(resp.request.headers)

很明显这是个python程序

我们来修改headers,假装自己是浏览器(一个简单的小反爬)

import requests

url="https://movie.douban.com/top250"
# 把F12中的User-Agent信息拷过来,改成字典格式
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36"}

# 把字典传入headers参数即可
resp = requests.get(url=url,headers=headers)
print(resp.request.headers)
print(resp.text)

看这次的User-Agent信息

网页返回结果很长,我们简单搜一个电影名,能看到就OK

       不少网页都会有这个请求头检测功能,所以headers参数其实也可以作为常规参数加上,避免每次再去处理。

三、使用变量

我们换一个小说网页 https://www.qu-la.com/

假如我要搜一本小说,更好的方式是把书名作为一个变量,例如

https://so.biqusoso.com/s2.php?ie=utf-8&siteid=qu-la.com&q=探虚陵

1. 直接在字符串使用变量

格式是 url = f'xxx网址其他部分xxx{变量名}'

import requests  # 导入requests包

book = "探虚陵"
url = f'https://so.biqusoso.com/s2.php?ie=utf-8&siteid=qu-la.com&q={book}'
response = requests.get(url)  # Get方式获取网页数据
print(response.request.url)
# 最后记得关掉response
response.close()

那串乱码不用管它,从网页直接复制中文也会变成这样,点击可以访问的

2. 查看入参

F12 还可以查看输入的参数,注意?后面的都是入参(黄色部分)

https://so.biqusoso.com/s2.php?ie=utf-8&siteid=qu-la.com&q=探虚陵

所以可以看到,这个网页一共有3个参数

3. get请求传参

对于搜索框输入的、网页url里直接写的,基本上都是get格式的。如果要确认的话可以抓包查看。

get请求的传参方法是:

将Query String Parameters部分的参数全部复制出来,组一个字典,然后通过get方法的params参数传进去。

book = "探虚陵"
myParams = {
"ie": "utf-8",
"siteid": "qu-la.com",
"q": book
}

代码如下

import requests  # 导入requests包

book = "探虚陵"

# 获取到的参数
myParams = {
"ie": "utf-8",
"siteid": "qu-la.com",
"q": book
}

#url,只要问号前面部分
url = 'https://so.biqusoso.com/s2.php'

# Get方式获取网页数据,params传参
response = requests.get(url=url,params=myParams)
# 查看拼出来的链接结果
print(response.request.url)

# 最后记得关掉response
response.close()

输出结果是一样的

4. post请求传参

post请求通常传一些机密性比较高的内容。这个案例稍微复杂一点,主要复杂在抓包的部分,这次用百度翻译的网页做例子

F12打开抓包工具,刷新,在我们什么都没输的时候有3个页面。选all的话页面会太多,数据相关的主要在Fetch/XHR部分,所以直接点到这部分。

输入一个dog(注意要用英文输入法,否则新的页面不会出来)

新增了好多页面,怎么找哪一个有dog的翻译数据?

       逐个点点新增的页面,选中preview,看看页面效果。你会发现有一个sug的内容跟下拉框是一样的,这就是我们要找的数据。

如果打开源码看看,你会发现没有搜索出来的“狗”这个关键字

       其实这就是前面提到的客户端渲染的网页。它的源码中只有一个框架,数据是在第二次请求的时候传入的(输入dog,才新传入sug中的数据)。

       点headers,可以看到这是个post类型的请求,并且真正的url是https://fanyi.baidu.com/sug

它的入参也在Payload页面,就一个 kw:dog

这样我们需要的关键元素就齐活了:

import requests 

# 待查单词
word = 'dog'
# 入参字典
myParams = {
"kw": word
}

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

# Get方式获取网页数据,params传参
response = requests.post(url=url,params=myParams)
# 查看返回数据
print(response.json())
response.close()

代码跟之前get其实没太大区别,主要是两点:

  1. get方法变成了post方法
  2. 返回的数据直接是json格式(还记得我们之前提到过,客户端渲染虽然抓包麻烦一点,但返回的数据通常都是格式化的,处理更方便)

5. 一个常用案例——传参翻页

上面的功能其实还不太常用,最常用的可以处理翻页问题,来看这个网页,随便找一本小说 https://m.gdedu.tv/dir/73358/?page=2&sort=asc

改一下代码,循环page参数(这个页数比较简单,可以直接看出来的)

import requests 

#url,只要问号前面部分
url = 'https://m.gdedu.tv/dir/73358/'

for i in range(1,5):
    # 获取到的参数
    myParams = {
    "page": i,
    "sort": "arc"
    }

    # Get方式获取网页数据,params传参
    response = requests.get(url,params=myParams)
    # 查看拼出来的链接结果
    print(response.request.url)
    # 最后记得关掉response
    response.close()

查看拼出来的链接

都是可以打开的 https://m.gdedu.tv/dir/73358/?page=1&sort=arc

四、 遗留问题

1. 随便点进去一个链接,里面还有很多具体章节,怎么爬取具体章节信息?

       这里先简单提一下,点击查看源码,你会看到每个标题都是一个超链接,后面我们会学习怎么提取这些超链接和章节名。

再随便打开一章,你会发现每章里面也是有分页的

再用F12获取下对应的参数,找啊找,发现没有对应的page参数。很明显这个页数就在链接里了。

2. 这种情况要怎么判断每章有多少页,下页链接是什么呢?

其实同理,这个“下一章”也有自己对应的链接

      查看源码,搜729776,这玩意在JavaScript标签里。但是没关系,只要你会匹配上面的超链接,你自然就会匹配下面这个,具体我们以后再看~

参考:B站课程 P1-P16

2021年最新Python爬虫教程+实战项目案例(最新录制)_哔哩哔哩_bilibili

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 对于python数据分析项目——链家上海二手房数据分析(一),我可以提供一些帮助。首先,你可以使用Python中的Pandas库来收集和处理链家上海二手房的数据。Pandas可以帮助你从网站上获取相关信息,并针对指定的数据集执行许多不同的操作,以便更好地分析和理解这些数据。此外,还可以使用Matplotlib库来可视化数据,以便更清楚地了解链家上海二手房的特征。 ### 回答2: 链家上海二手房数据分析是一个使用Python进行数据探索和分析的项目。通过对链家网站上的二手房数据进行爬虫操作,我们可以获取到大量的关于上海二手房的信息。 在这个项目中,我们首先需要搭建一个爬虫,用于从链家网站上获取到二手房的数据。我们可以利用Python中的网络请求库和解析库,如requests和BeautifulSoup,来发送网络请求并解析返回的网页内容,从而获取到我们需要的数据获取数据后,我们可以进行数据清洗和预处理。这一步骤主要是针对数据中存在的缺失值、异常值等问题进行处理,以确保数据的准确性和一致性。我们可以使用Python中的pandas库来进行数据的清洗和预处理操作。 接下来,我们可以对数据进行探索性分析。通过使用Python中的数据可视化库,如matplotlib和seaborn,我们可以对数据的特征进行可视化展示,以便更好地理解数据的分布和关系。我们可以绘制直方图、散点图、箱线图等来探索二手房价格、面积、位置等特征与其他变量之间的关系。 最后,我们可以进行一些统计分析,如计算二手房价格的平均值、中位数等统计指标,以及进行一些基本的回归分析,如线性回归等。这些分析可以帮助我们揭示出二手房市场的一些趋势和规律,为我们做出更好的决策提供依据。 总之,链家上海二手房数据分析项目是一个利用Python进行数据爬取、清洗、探索和分析的项目,通过对这些步骤的操作,我们可以更好地理解上海二手房市场的情况,并从中获取到有价值的信息。 ### 回答3: 链家是中国最大的房地产经纪公司之一,在其网站上能够找到各个城市的二手房信息。本项目选取了链家上海的二手房数据进行分析。 首先,我们需要从链家网站上爬取二手房的相关数据,包括房屋的价格、面积、区域、朝向、装修情况等等。通过分析这些数据,我们能够得到一些有趣的结论。 比如,我们可以通过计算平均价格和面积,找出上海不同区域二手房的价格及面积分布情况。通过这些分布情况,我们可以了解到哪些区域的二手房更贵,哪些区域的二手房面积更大,帮助购房者做出更明智的决策。 此外,我们还可以通过数据分析,得到不同房屋朝向和装修情况对价格的影响。通过比较不同朝向和装修情况下的价格差异,我们可以了解到市场对于这些因素的偏好,从而也为购房者提供一些参考。 另外,我们还可以通过分析不同时间段内的二手房成交量,找出上海二手房市场的活跃时段。这对于购房者来说也是非常有用的,因为他们可以根据市场活跃程度来选择合适的时间进行购买。 最后,我们还可以通过数据分析,找出上海二手房市场的热门区域和热门楼盘。这些信息对于投资者来说尤为重要,因为他们可以根据市场趋势来选择合适的投资区域和楼盘。 通过对链家上海二手房数据的分析,我们可以得到很多有用的信息,帮助购房者和投资者做出更明智的决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值