ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

爬虫学习

2021-05-08 23:35:37  阅读:158  来源: 互联网

标签:fp 请求 url 爬虫 学习 headers json requests


需要掌握Python对于文件的操作和json库

这是基于requests模块的爬虫学习

requests是Python原生中一款基于网络请求的模块,优势就是简单便捷,效率高。

作用:模拟浏览器发送请求。

使用方法:

  • 指定url
  • 发起请求
  • 获取响应数据
  • 对数据进行持久化存储

简单做个示例:

import requests
url = 'https://www.sogou.com/'
response = requests.get(url)
page_text = response.text
print(page_text)
with open('./sogou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
    
print("Successful!")

2、获取百度指定词条的搜索结果页面

第一种接触的反爬机制:UA(User-Agent)伪装,就是请求载体的身份标识,将自己伪装成浏览器而不是爬虫程序

UA伪装:将对应的User-Agent封装到一个字典中

import requests

# UA伪装
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
    (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}

url = 'https://www.baidu.com/s'

# 因为参数需要是动态的
# 处理URL携带的参数,封装到字典中
query = input("Input what you want to query")
param = {
    'wd' : query 
}

# 对指定的url发起请求
response = requests.get(url=url,params=param,headers=headers)
page_text = response.text

fileName = query + '.html'
with open(fileName,'w',encoding='utf-8') as fp:
    fp.write(page_text)
    
print("Successful")

3、获取百度翻译的单词翻译结果

在百度翻译中我们遇到了一个页面局部刷新的情况,而页面局部刷新是可以由Ajax实现的,当我们在百度翻译的文本框中录入数据时,会自动进入Ajax请求发送,会对我们叶面的局部内容进行一个刷新。我们就可以去捕获一下这个Ajax请求。

现在我们在百度翻译的文本框中输入dog这个单词。

抓包中all对应所有请求,而XHR就是Ajax这些请求对应的数据包。、

在XHR中,通过分析可以发现sug中是一个Post请求,一个出现了三次,携带的参数分别为'd','do'和'dog',可知这就是3次Ajax请求,对应的是每一个字符的翻译结果。我们需要的是dog的,也就是第三个Ajax的结果。

Response Headers中可以看到Content-Type,这就是服务器端响应回客户端的数据类型。可以知道我们返回的是一个json串,我们在Response选项卡中可以看到响应回来的json数据。

通过对转包的分析,我们可以知道:

  • 我们发送了一个Post请求,这个请求携带了参数,我们需要request模块对这个请求的URL进行一次请求发送,且Post请求发送后如何处理这个请求携带的参数
  • 这个响应数据是一组json数据

百度由于对百度翻译加上了反爬机制,所以目前获取不到结果了。不过headers(重点是useragent)和代理ip和动态验证码,这三个加上基本就没问题了,等学完爬虫来试一下能不能骗过百度的反爬机制。

import requests
import json

# UA伪装
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}

post_url = 'https://fanyi.baidu.com/sug'
# 这里封装我们携带的参数
data = {
    'word':'dog'
}

resopnse = requests.post(url=post_url,data=data,headers=headers)

json_obj = resopnse.json() # 直接返回一个对象
print(json_obj)

# 持久化存储
fp = open('./dog.json','w',encoding='utf-8')
# 返回的是有中文的,不能使用ASCII进行编码
json.dump(json_obj,fp=fp,ensure_ascii=False)
fp.close()

print("Success!")

4、爬取豆瓣电影分类排行榜

每次滚轮滑动到最下方滚轮就会回滚到中间,说明触发了Ajax请求。

通过抓包在XHR可以知道触发了Get请求,在最后可以看到Get请求携带的五个参数,说明我们对这个URL发起了一个Get请求并且携带参数,根据Content-Type可以知道返回的是一组Json数据。

import requests
import json

# UA伪装
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51'
}

url = 'https://movie.douban.com/j/chart/top_list'
# 但凡有参数我们最好用字典封装起来
params = {
    'type':'24',
    'interval_id':'100:90',
    'action':'',
    'start':'1',
    'limit':'20'
}

response = requests.get(url = url,params=params,headers=headers)
list_data = resopnse.json()
print(list_data)
fp = open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
fp.close()
print("Successful!")

标签:fp,请求,url,爬虫,学习,headers,json,requests
来源: https://www.cnblogs.com/ApStar/p/14746909.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有