本文主要是介绍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 包括了三个部分:
-
Status Code: 描述了这次回应的状况. 它可以用来检查这次请求是否成功完成. 一旦copy请求失败了, 这个status code可以用来寻找原因. 如果你的 servlet 没有返回一个status code, 默认就会返回成功的status code,HttpServletResponse.SC_OK.
-
Headers: 它包含了response的更多信息.举个例子,headers可以反应response的访问知date/time, 或者是用于将实体安全道地传送到用户的编码形式。
-
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) # 图片(音乐,视频,PPTX,WORD等)一般用的二进制数据保存的,所以需要用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--简单爬虫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!