一个入门级python爬虫教程详解


Posted in Python onJanuary 27, 2021

前言

本文目的:根据本人的习惯与理解,用最简洁的表述,介绍爬虫的定义、组成部分、爬取流程,并讲解示例代码。

基础

爬虫的定义:定向抓取互联网内容(大部分为网页)、并进行自动化数据处理的程序。主要用于对松散的海量信息进行收集和结构化处理,为数据分析和挖掘提供原材料。

今日t条就是一只巨大的“爬虫”。

爬虫由URL库、采集器、解析器组成。

流程

如果待爬取的url库不为空,采集器会自动爬取相关内容,并将结果给到解析器,解析器提取目标内容后进行写入文件或入库等操作。

一个入门级python爬虫教程详解

代码

第一步:写一个采集器

如下是一个比较简单的采集器函数。需要用到requests库。
首先,构造一个http的header,里面有浏览器和操作系统等信息。如果没有这个伪造的header,可能会被目标网站的WAF等防护设备识别为机器代码并干掉。

然后,用requests库的get方法获取url内容。如果http响应代码是200 ok,说明页面访问正常,将该函数返回值设置为文本形式的html代码内容。

如果响应代码不是200 ok,说明页面不能正常访问,将函数返回值设置为特殊字符串或代码。

import requests

def get_page(url):
	headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
	response = requests.get(url, headers= headers)
	if response.status_code == 200:
	  return response.text
	else:
		return 'GET HTML ERROR !'

第二步:解析器

解析器的作用是对采集器返回的html代码进行过滤筛选,提取需要的内容。
作为一个14年忠实用户,当然要用豆瓣举个栗子 _

我们计划爬取豆瓣排名TOP250电影的8个参数:排名、电影url链接、电影名称、导演、上映年份、国家、影片类型、评分。整理成字典并写入文本文件。

待爬取的页面如下,每个页面包括25部电影,共计10个页面。

一个入门级python爬虫教程详解

在这里,必须要表扬豆瓣的前端工程师们,html标签排版非常工整具有层次,非常便于信息提取。

下面是“肖申克的救赎”所对应的html代码:(需要提取的8个参数用红线标注)

一个入门级python爬虫教程详解

根据上面的html编写解析器函数,提取8个字段。该函数返回值是一个可迭代的序列。
我个人喜欢用re(正则表达式)提取内容。8个(.*?)分别对应需要提取的字段。

import re

def parse_page(html):
	pattern = re.compile('<em class="">(.*?)</em>.*?<a href="(.*?)" rel="external nofollow" rel="external nofollow" >.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?<p class="">(.*?) .*?<br>(.*?) / (.*?) / (.*?)</p>.*?<span class="rating_num".*?"v:average">(.*?)</span>' , re.S)
	items = re.findall(pattern , html)
	for item in items:
		yield {
		  'rank': item[0],
		  'href': item[1],
		  'name': item[2],
		  'director': item[3].strip()[4:],
		  'year': item[4].strip(),
		  'country': item[5].strip(),
		  'style': item[6].strip(),
		  'score': item[7].strip()
		}

提取后的内容如下:

一个入门级python爬虫教程详解

整理成完整的代码:(暂不考虑容错)

import requests
import re
import json

def get_page(url):
	#采集器函数
	headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
	response = requests.get(url, headers= headers)
	if response.status_code == 200:
	  return response.text
	else:
		return 'GET HTML ERROR ! '


def parse_page(html):
	#解析器函数
	pattern = re.compile('<em class="">(.*?)</em>.*?<a href="(.*?)" rel="external nofollow" rel="external nofollow" >.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?<p class="">(.*?) .*?<br>(.*?) / (.*?) / (.*?)</p>.*?<span class="rating_num".*?"v:average">(.*?)</span>' , re.S)
	items = re.findall(pattern , html)
	for item in items:
		yield {
		  'rank': item[0],
		  'href': item[1],
		  'name': item[2],
		  'director': item[3].strip()[4:],
		  'year': item[4].strip(),
		  'country': item[5].strip(),
		  'style': item[6].strip(),
		  'score': item[7].strip()
		}


def write_to_file(content):
	#写入文件函数
	with open('result.txt' , 'a' , encoding = 'utf-8') as file:
		file.write(json.dumps(content , ensure_ascii = False) + '\n')


if __name__== "__main__":
	# 主程序
	for i in range(10):
		url= 'https://movie.douban.com/top250?start='+ str(i*25)+ '&filter'
		for res in parse_page(get_page(url)):
			write_to_file(res)

非常简洁,非常符合python简单、高效的特点。

说明:

需要掌握待爬取url的规律,才能利用for循环等操作自动化处理。
前25部影片的url是https://movie.douban.com/top250?start=0&filter,第26-50部影片url是https://movie.douban.com/top250?start=25&filter。规律就在start参数,将start依次设置为0、25、50、75。。。225,就能获取所有页面的链接。parse_page函数的返回值是一个可迭代序列,可以理解为字典的集合。运行完成后,会在程序同目录生成result.txt文件。内容如下:

一个入门级python爬虫教程详解 

到此这篇关于一个入门级python爬虫教程详解的文章就介绍到这了,更多相关python爬虫入门教程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
在Python中使用全局日志时需要注意的问题
May 06 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
Django model反向关联名称的方法
Dec 15 Python
python xpath获取页面注释的方法
Jan 14 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
Pandas读取csv时如何设置列名
Jun 02 Python
深入了解python列表(LIST)
Jun 08 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
Pandas数据类型之category的用法
Jun 28 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 #Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 #Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 #Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 #Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 #Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 #Python
python re.match()用法相关示例
Jan 27 #Python
You might like
Memcache 在PHP中的使用技巧
2010/02/08 PHP
PHP的博客ping服务代码
2012/02/04 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
javascript Math.random()随机数函数
2009/11/04 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
js中的reduce()函数讲解
2019/01/18 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
python静态方法实例
2015/01/14 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
pandas删除指定行详解
2019/04/04 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
建筑施工安全责任书
2014/07/24 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
2019年大学推荐信
2019/06/24 职场文书
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA