一文带你了解Python 四种常见基础爬虫方法介绍


Posted in Python onDecember 04, 2020

一、Urllib方法

Urllib是python内置的HTTP请求库

import urllib.request
#1.定位抓取的url
url='http://www.baidu.com/'
#2.向目标url发送请求
response=urllib.request.urlopen(url)
#3.读取数据
data=response.read()
# print(data) #打印出来的数据有ASCII码
print(data.decode('utf-8')) #decode将相应编码格式的数据转换成字符串
#post请求
import urllib.parse
url='http://www.iqianyue.com/mypost/'
#构建上传的data
postdata=urllib.parse.urlencode({
 'name':'Jack',
 'pass':'123456'
}).encode('utf-8') #字符串转化成字节流数据
html=urllib.request.urlopen(url,data=postdata).read()
print(html)
#headers针对检验头信息的反爬机制
import urllib.request
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
request1=urllib.request.Request('https://www.dianping.com/',headers=headers)#Request类构建了一个完整的请求
response1=urllib.request.urlopen(request1).read()
print(response1.decode('utf-8'))
#超时设置+异常处理
import urllib.request
import urllib.error
for i in range(20):
 try:
  response1=urllib.request.urlopen('http://www.ibeifeng.com/',timeout=0.01)
  print('a')
 except urllib.error.URLError as e:
  print(e)
 except BaseException as a: #所有异常的基类
  print(a)

二、requests方法

?Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库
?urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。
?requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。
?默认安装好python之后,是没有安装requests模块的,需要单独通过pip安装

import requests
#get请求
r=requests.get('https://www.taobao.com/')
#打印字节流数据
# print(r.content)
# print(r.content.decode('utf-8')) #转码
print(r.text) #打印文本数据

import chardet
#自动获取到网页编码,返回字典类型
print(chardet.detect(r.content))
POST请求实现模拟表单登录
import requests
#构建上传到网页的数据
data={
 'name':'Jack',
 'pass':'123456'
}
#带登陆数据发送请求
r=requests.post('http://www.iqianyue.com/mypost/',data=data)
print(r.text) #打印请求数据
#将登录后的html储存在本地
f=open('login.html','wb')
f.write(r.content) #写入字节流数据
f.close()
#针对检验头信息的反爬机制headers
import requests
#构建headers
headers={
 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
r=requests.get('https://www.dianping.com/',headers=headers)
print(r.text)
print(r.status_code) #状态403 被拦截了(查看状态)
#cookies
#跳过登陆,获取资源
import requests
f=open('cookie.txt','r') #打开cookie文件
#初始化cookies,声明一个空字典
cookies={}
#按照字符 ; 进行切割读取,返回列表数据,然后遍历
#split():切割函数 strip()去除字符串前后空白
for line in f.read().split(';'):
 #split将参数设置为1,把字符串切割成两个部分
 name,value=line.strip().split('=',1)
 #为空字典cookies添加内容
 cookies[name]=value
r=requests.get('http://www.baidu.com',cookies=cookies)
data=r.text
f1=open('baidu.html','w',encoding='utf-8')
f1.write(data)
f1.close()
#设置代理(网站搜索免费代理ip)
#解决网页封IP的问题
import requests
proxies={
 #'协议':'ip:端口号'
 'HTTP':'222.83.160.37:61205'
}
req=requests.get('http://www.taobao.com/',proxies=proxies)
print(req.text)

#设置超时
import requests
from requests.exceptions import Timeout
try:
 response = requests.get("http://www.ibeifeng.com ", timeout=0.01)
 print(response.status_code)
except Timeout:
 print('访问超时!')

三、BS4- BeautifulSoup4解析

from bs4 import BeautifulSoup
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" rel="external nofollow" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" rel="external nofollow" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""
# #创建一个BS对象
soup=BeautifulSoup(html,'html.parser') #html.parser默认解析器
print(type(soup))
# 结构化输出
print(soup.prettify())
#1获取标签(只能获取第一条对应的标签)
print(soup.p) #获取p标签
print(soup.a) #获取a标签
print(soup.title) #获取title
#2获取标签内容
print(soup.title.string)
print(soup.a.string)
print(soup.body.string) #如果标签中有多个子标签返回None
print(soup.head.string) #如果标签中有一个子标签返回子标签里的文本
#3获取属性
print(soup.a.attrs) #返回字典
print(soup.a['id']) #得到指定属性值
#4操作字节点
print(soup.p.contents) #得到标签下所有子节点
print(soup.p.children) #得到标签下所有子节点的迭代对象
#5操作父节点
print(soup.p.parent) #得到标签p的父节点其内部的所有内容
print(soup.p.parents) # 得到标签p的父节点的迭代对象
#6操作兄弟节点(同级的节点)
#next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素
print(soup.a.next_sibling)
print(soup.a.previous_sibling)

#二.搜索文档数
#1标签名
#查询所有a标签
res1=soup.find_all('a')
print(res1)
#获取所有a标签下属性为class="sister"的标签(
#使用 class 做参数会导致语法错误,这里也要用class_)
print(soup.find_all('a',class_="sister"))
#2正则表达式
import re
#查询所有包含d字符的标签
res2=soup.find_all(re.compile('d+'))
print(res2)
#3列表
#查找所有的title标签和a标签
res3=soup.find_all(['title','a'])
print(res3)
#4关键词
#查询属性id='link1'的标签
res4=soup.find_all(id='link1')
print(res4)
#5内容匹配
res5=soup.find_all(text='Tillie') #文本匹配
res55=soup.find_all(text=re.compile('Dormouse'))
print(res55)
#6嵌套选择
print(soup.find_all('p'))
#查看所有p标签下所有的a标签
for i in soup.find_all('p'):
 print(i.find_all('a'))

#三.CSS选择器
#1根据标签查询对象
res6=soup.select('a') #返回列表
print(res6) #得到所有的a标签
#2根据ID属性查询标签对象(id用#)
print(soup.select('#link2'))
#3根据class属性查询标签对象(class用.)
print(soup.select('.sister'))
print(soup.select('.sister')[2].get_text()) #获取文本内容
#4属性选择(获取a标签里=href属性值的标签)
print(soup.select('a[href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" ]'))
#5包含选择(获取)
print(soup.select('p a#link1'))
#6并列选择
print(soup.select('a#link1,a#link2'))
#7得到标签内容
res7=soup.select('p a.sister')
for i in res7:
 print(i.get_text())
#练习:爬取51job主页12个职位
from bs4 import BeautifulSoup
import requests
url='https://www.51job.com/'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
html=requests.get(url,headers=headers)
data=html.content.decode('gbk')
soup=BeautifulSoup(data,'html.parser')
#获取span标签,class_="at"属性
span=soup.find_all('span',class_="at")
# for i in span:
#  print(i.get_text())
#select方法(CSS选择器)
span1=soup.select('span[class="at"]')
for m in span1:
 print(m.get_text())

四、XPath语法

XPath 是一门在 XML 文档中查找信息的语言。
XPath 可用来在 XML 文档中对元素和属性进行遍历

from lxml import etree
text='''
 <html>
  <head>
   <title>春晚</title>
  </head>
  <body>
   <h1 name="title">个人简介</h1>
   <div name="desc">
    <p name="name">姓名:<span>岳云鹏</span></p>
    <p name="addr">住址:中国 河南</p>
    <p name="info">代表作:五环之歌</p>
   </div>
'''
#初始化
html=etree.HTML(text)
# result=etree.tostring(html) #字节流
# print(result.decode('utf-8'))
#查询所有的p标签
p_x=html.xpath('//p')
print(p_x)
#查询所有p标签的文本,用text只能拿到该标签下的文本,不包括子标签
for i in p_x:
 print(i.text) #发现<span>没有拿到
#优化,用string()拿标签内部的所有文本
for i in p_x:
 print(i.xpath('string(.)'))
# 查询所有name属性的值
attr_name=html.xpath('//@name')
print(attr_name)
#查询出所有包含name属性的标签
attr_name1=html.xpath('//*[@name]')
print(attr_name1)

到此这篇关于一文带你了解Python 四种常见基础爬虫方法介绍的文章就介绍到这了,更多相关Python 基础爬虫内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 数据结构之旋转链表
Feb 25 Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
python各类经纬度转换的实例代码
Aug 08 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
原生python实现knn分类算法
Oct 24 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
Python imread、newaxis用法详解
Nov 04 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
关于多元线性回归分析——Python&amp;SPSS
Feb 24 Python
Python打印不合法的文件名
Jul 31 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 #Python
python飞机大战游戏实例讲解
Dec 04 #Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 #Python
python中字符串的编码与解码详析
Dec 03 #Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 #Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 #Python
python3代码输出嵌套式对象实例详解
Dec 03 #Python
You might like
php MessagePack介绍
2013/10/06 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
php和html的区别点详细总结
2019/09/24 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
js 窗口抖动示例
2013/09/04 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
python 测试实现方法
2008/12/24 Python
简介Python中用于处理字符串的center()方法
2015/05/18 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
python 中yaml文件用法大全
2021/07/04 Python
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android