爬虫入门整理

爬虫的基本流程

1.发起请求:

通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,然后等待服务器响应。这个请求的过程就像我们打开浏览器,在浏览器地址栏输入网址:www.baidu.com,然后点击回车。这个过程其实就相当于浏览器作为一个浏览的客户端,向服务器端发送了 一次请求。

2.获取响应内容:

如果服务器能正常响应,我们会得到一个Response,Response的内容便是所要获取的内容,类型可能有HTML、Json字符串,二进制数据(图片,视频等)等类型。这个过程就是服务器接收客户端的请求,进过解析发送给浏览器的网页HTML文件。

3.解析内容:

得到的内容可能是HTML,可以使用正则表达式,网页解析库进行解析。也可能是Json,可以直接转为Json对象解析。可能是二进制数据,可以做保存或者进一步处理。这一步相当于浏览器把服务器端的文件获取到本地,再进行解释并且展现出来。

4.保存数据:

保存的方式可以是把数据存为文本,也可以把数据保存到数据库,或者保存为特定的jpg,mp4 等格式的文件。这就相当于我们在浏览网页时,下载了网页上的图片或者视频。

相关的库:

  • requests库
  • lxml类库

Requests库介绍

Requests库是Python中的一个HTTP网络请求库,浏览器会发送信息给该网址所在的服务器

爬取第一个网页
这里以 “http://www.baidu.com“为例。
第一步:导入requests库

import requests

第二步:创建一个url,这里是”http://www.baidu.com

url = "http://www.baidu.com"

第三步:对”http://www.baidu.com“发起一个get请求

response = requests.get(url)

这里的response是一个对象,response 对象是服务器发送到客户端的数据

第四步:可以调用response对象的方法将服务器端的数据打印一下

print(response.text)

在这里插入图片描述
可以看到这里的数据是乱码,出现这种情况的原因是:response.text 的解码是根据HTTP头部对响应的编码做出有根据的推测,推测的文本编码。也就是说它的解码方式只是一种推测,并不一定正确。
那如何修改编码方式呢?
可以在打印之前增加一行:

response.enconding("utf-8")

这行的作用就是将编码格式改为 utf-8 编码,这对大多数网页来说都是可行的。
结果如下:
在这里插入图片描述
响应状态:有多种响应状态,比如200代表成功,301 跳转页面,404 表示找不到页面,502 表示服务器错误;

print(response.status_code) # 打印出状态码

在这里插入图片描述

lxml类库介绍

lxml类库是一个Html/XML的解析器,主要功能是如何解析和提取HTML/XML数据。

etree将文本转成html:

# 将文本转成html对象
html = etree.HTML(text) 

# 将html对象转成html的文本信息
etree.tostring(html)

lxml.etree中提供了几种方法用于解析文本:

etree.fromstring()  # 用于解析字符串
etree.HTML()        # 用于解析HTML对象
etree.XML()         # 用于解析XML对象
etree.parse()       # 用于解析文件类型的对象

XPath介绍

XPath(XML Path Language)是一门在XML文档中查找信息的语言,可用来在XML文档中对元素和属性进行遍历。Xpath为XML路径语言,用来确定XML文档中某个位置,类似于地理中经纬网的作用。

XPath的节点有7种类型:文档节点,元素节点,属性节点,文本节点,命名空间节点,处理指令节点,注释节点。对于我们需要关注的是前面4个节点。

用 Xpath 获取静态文本:

import requests
from lxml import etree

# 用Requests库抓取整个页面
url = 'http://data.eastmoney.com/cjsj/cpi.html'
content = requests.get(url).content

# 用etree.HTML()解析对象
html = etree.HTML(content)

# 右键copy.Xpath复制后,通过etree.xpath()函数调用
html.xpath('//*[@id="tb"]/tr[3]/td[2]/text()')
# 部分浏览器会在table标签下添加tbody标签,因此将Xpath中的tbody删去,否则将无法获取数据。

以Chrome为例,按f12检查网页,用箭头点击自己想要的地方,比如我想提取出“故宫博物院”的xpath地址,右击,点击copy,然后选择copy xpath。这样我们就获得“故宫博物院”的xpath。

import requests
from lxml import etree
import lxml
url="http://www.meituan.com/xiuxianyule/271772/"
#你需要爬取的网页
html=requests.get(url)
html.encoding="utf-8"
selecter=etree.HTML(html.text)
#将你的xpath复制到三引号里面,因为xpath里可能有双引号,所以我们加上三引号比较靠谱
s=selecter.xpath("""//*[@id="lego-widget-play-mt-poi-001-000"]/div/div[2]/div[1]/h1/text()""")
print (s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值