python爬虫编程实践 Task1--简单爬虫

2023-10-20 14:50

本文主要是介绍python爬虫编程实践 Task1--简单爬虫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个网络爬虫程序最普遍的过程:
1.访问站点;
2.定位所需的信息;
3.得到并处理信息。

示例1:爬取python之禅(The Zen of Python)

requests.get

获取HTML网页的主要方法,对应于HTTP的GET

import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
r = requests.get(url)  #获取url信息
text = r.text
text

在这里插入图片描述
可以看到返回的其实就是开发者工具下Elements的内容,只不过是字符串类型,接下来我们要用python的内置函数find来定位“python之禅”的索引,然后从这段字符串中取出它。

通过观察网站,我们可以发现这段话在一个特殊的容器中,通过审查元素,使用快捷键Ctrl+shift+c快速定位到这段话也可以发现这段话包围在pre标签中,因此我们可以由这个特定用find函数找出具体内容。

<pre> 标签可定义预格式化的文本。被包围在 <pre> 标签 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。
在这里插入图片描述

open(path, ‘-模式-’,encoding=’UTF-8’)
即:open(路径+文件名, 读写模式, 编码)
读写模式:

r :只读 
r+ : 读写 
w : 新建(会对原有文件进行覆盖) 
a : 追加 
b : 二进制文件
# 爬取python之禅并存入txt文件with open('zon_of_python.txt', 'w') as f: # 新建一个zon_of_python.txt文件f.write(text[text.find('<pre')+28:text.find('</pre>')-1]) # 切片提取并写入文件(find就是找到对应字符的索引)
start_index=text.find('<pre')+28
end_index=text.find('</pre>')-1
print(text[start_index:end_index])

在这里插入图片描述
也可以利用python自带的urlib库完成上面的操作。
urllib是python3的标准库,包含了很多基本功能,比如向网络请求数据、处理cookie、自定义请求头等,显然,就代码量而言,urllib的工作量比Requests要大,而且看起来也不甚简洁。
代码如下所示:

import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')  
print(res[res.find('<pre')+28:res.find('</pre>')-1])   

在这里插入图片描述

requests.post

我们先以金山词霸为例,有道翻译百度翻译谷歌翻译都有加密,以后可以自己尝试。

首先进入金山词霸首页http://www.iciba.com/

然后打开开发者工具下的“Network”,翻译一段话,比如刚刚我们爬到的第一句话“Beautiful is better than ugly.”

点击翻译后可以发现Name下多了一项请求方法是POST的数据,点击Preview可以发现数据中有我们想要的翻译结果
在这里插入图片描述

我们目前需要用到的两部分信息是Request Headers中的User-Agent,和Form Data
在这里插入图片描述
接下来利用金山词霸来翻译我们刚刚爬出来的pyhon之禅

import requests
def translate(word):url="http://fy.iciba.com/ajax.php?a=fy" # 这个链接直接访问不了的原因:请求分两种,一种是同步请求,一种是异步请求(XHR,不能通过浏览器URL访问)# 同步请求:一般指访问页面# 异步请求:一般在页面加载好后,用户在与页面交互时,页面处理客户的请求就会发出异步请求到后端,等待后端处理后返回来再渲染到页面上。# 为什么存在异步请求呢,例如你查中文翻译,不可能每次结果查出来后都要重新加载一次页面,这样子等待时间长且用户体验差,所以前端一般操作是发出异步请求让后端处理data={'f': 'auto','t': 'auto','w': word,}headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。response = requests.post(url,data=data,headers=headers)     #发起请求,返回一个response对象json_data=response.json()   #解析获取json数据,一般异步请求中,后端都是把带json数据的response传回来print(json_data)return json_datadef run(word):    result = translate(word)['content']['out']   
#     print(result)return resultdef main():with open('zon_of_python.txt') as f:zh = [run(word) for word in f]with open('zon_of_python_zh-CN.txt', 'w') as g:for i in zh:g.write(i + '\n')if __name__ == '__main__':main()

在这里插入图片描述

示例2:request.get进阶:爬取豆瓣电影Top250

  • os.path.exists(path)
    如果path存在,返回True;如果path不存在,返回False。
  • HTTP response 包括了三个部分:
  1. Status Code: 描述了这次回应的状况. 它可以用来检查这次请求是否成功完成. 一旦copy请求失败了, 这个status code可以用来寻找原因. 如果你的 servlet 没有返回一个status code, 默认就会返回成功的status code,HttpServletResponse.SC_OK.

  2. Headers: 它包含了response的更多信息.举个例子,headers可以反应response的访问知date/time, 或者是用于将实体安全道地传送到用户的编码形式。

  3. Body: 它是response的具体内容. 可能包括HTML内容,比如图片。Body包括了紧接Header发送的HTTP事务消息数据字节。

import requests
import os  # os 模块提供了非常丰富的方法用来处理文件和目录if not os.path.exists('image'):os.mkdir('image') # 创建目录(文件夹)def parse_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}res = requests.get(url, headers=headers)text = res.textitem = []for i in range(25):text = text[text.find('alt')+3:]  # 切片提取需要的字符串item.append(extract(text))  return itemdef extract(text):text = text.split('"')name = text[1]image = text[3]return name, imagedef write_movies_file(item, stars):print(item)with open('douban_film.txt','a',encoding='utf-8') as f:f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))r = requests.get(item[1]) # response对象with open('image/' + str(item[0]) + '.jpg', 'wb') as f:f.write(r.content)  # 图片(音乐,视频,PPTXWORD等)一般用的二进制数据保存的,所以需要用content方法去解析,再写进去。#一个文件,如果用记事本打开后可以看清楚里面的内容,他就是用字符保存。如果是乱码,那就是字节保存,以字节保存的文件一般都是以二进制解析def main():stars = 1for offset in range(0, 250, 25):url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='for item in parse_html(url):write_movies_file(item, stars)stars += 1if __name__ == '__main__':main()

在这里插入图片描述

这篇关于python爬虫编程实践 Task1--简单爬虫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247793

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu