python爬虫系列第一次笔记之基本库的使用
1.urllib的使用
1.1 使用urlib发送请求
1.1.1.urlopen()
urlib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起过程。同时还带有处理授权验证,重定向,浏览器Cookie以及其他内容
import urlib.request
response = urlib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))
那么这里会输出Python官网的爬取,输出网页的源代码。如果我们在上述代码后面加上
print(type(response))
会输出:
<class 'http.client.HTTPResponse'>
使用该函数输出的是一个HTTPRequest类型的对象,主要包含read(),readinto(),getheader()等方法,以及msg,version,status,reason等属性
如果想要给链接传递一些参数那么携带格式为:
urlib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None
,cadefault=False,context=None)
data参数:
要使用data参数,需要使用bytes()方法将参数转化为字节流编码格式,即bytes类型,如果传递了这个参数,那么它的请求方式就不再是GET方法,是POST方式
import urlib.parse
import urlib.request
data = bytes(urlib.parse.urlencode({'word': 'hello'}), encoding='utf8')
reponse = urlib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())
这里我们传递了一个参数word,值是hello.它需要被转码成bytes(字节流)类型。其中转字节流使用了bytes方法,该方法第一个参数需要是str(字符串)类型,需要使用urlib.parse模块里的urlopen()方法来将参数字典转化为字符串;第二个参数指定编码格式
我们请求的站点是httpbin.org,它可以提供HTTP请求测试,那么输出的结果中,我们传入的data参数会出现在form字段中。这表明是模拟了表单提交的方式,以POST方法传输数据
timeout参数:
timeout参数用于设置超时时间,单位为秒,意思是如果请求超出了设置的时间,还没有响应的话,就会抛出异常,当然还可以使用try except语句来实现,如果长时间没响应就跳过抓取,抛出异常,而不会中断操作
1.1.2.Request
使用urlopen()方法可以实现最基本的请求,但这几个简单参数并不足以构建一个完整的请求。如果请求中需要加入Headers信息,就需要使用Requst类
import urlib.request
request = urlib.request.Request('https://python.org')
response = urlib.request.urlopen(request)
print(response.read().decode('utf-8'))
这里依旧是使用urlopen()方法来发送这个请求,但是参数不再是一个url,而是一个Request类型的对象。通过这种方法,我们可以更加灵活的配置参数。
构建方法如下:
urlib.request.Request(url,data=None, headers={},origin_req_host=None, unverifiable=False, method=None)
第一个参数是url,是必传参数,其他都是可选参数
第二个参数data如果要传,必须传bytes类型的,方法可参考上面的方法
第三个参数headers是一个字典,他就是请求头,最常用的方法就是通过修改 User-Agent 来伪装浏览器,默认的是 Pyhton-urlib,我们可以通过修改它来伪装浏览器。
第四个参数origin_req_host指的是请求方的host名称或者IP地址
第五个参数unverifiable表示这个请求是否是无法验证的
第六个参数method是一个字符串,用来指示请求的方法,比如 GET,POST和PUT等
我们来传入试试
from urlib import request,parse
url = 'http://httpbin.org/post'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
'Host':'httpbin.org'
}
dict = {
'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url=url, data=data, headers=headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8')
另外,headers也可以使用add_header()方法来添加:
req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36')
1.1.3.高级用法
构造请求已经可以随意完成了,那么对于一些更高级的操作(比如Cookies处理,代理设置等),我们要怎么办呢?我们需要引入Handler
验证方法:
from urlib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urlib.error import URLError
username = 'uername'
password = 'password'
url = 'http://localhost:5000/'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
try:
result = opener.open(url)
html = result.read().decode('utf-8')
print(html)
except URLError as e:
print(e.reason)
这里首先实例化HTTPBasicAuthHandler对象,其参数是HTTPPasswordMgrWithDefaultRealm对象,使用add_password添加进去用户名和密码,这样就建立了一个处理验证的Handler.再用build_opener方法构建一个Opener,再用open()方法打开链接
代理方法:
使用爬虫,免不了使用代理,添加代理,可以这样做
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
proxy_handler = ProxyHandler({
'http': 'http://127.0.0.1:9734',
'https': 'https://127.0.0.1:9733'
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
Cookies处理:
首先我们需要将网站的Cookies获取下来
代码如下:
import http.cookiejar,urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
for item in cookie:
print(item.name+"="+item.value)
结果如下:
BAIDUID=AA7F1D8AE33B902C068E6D145477835A:FG=1
BIDUPSID=AA7F1D8AE33B902C8EDE0A9C553D73E7
PSTM=1609329941
BD_NOT_HTTPS=1
如果想输出为文件格式,代码如下:
import http.cookiejar,urllib.request
filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)
运行后会生成一个cookies.txt文件,内容为:
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.
.baidu.com TRUE / FALSE 1640866441 BAIDUID 8931522A2935AE5F8CA5107AB0157055:FG=1
.baidu.com TRUE / FALSE 3756814088 BIDUPSID 8931522A2935AE5FD4FE83670225746B
.baidu.com TRUE / FALSE 3756814088 PSTM 1609330441
www.baidu.com FALSE / FALSE 1609330741 BD_NOT_HTTPS 1
生成了文件后,如何读取并利用呢?
代码如下:
import http.cookiejar,urllib.request
cookie = http.cookiejar.MozillaCookieJar()
cookie.load('cookies.txt', ignore_discard=True,ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
这里使用load方法读取本地文件,然后构建handler和opener即可完成操作,输出网页源代码
1.2 处理异常
1.2.1URLError
这个类来自urlib库的error模块,继承自OSError类,具有一个属性reason,即返回错误的原因。
如果请求一个不存在的页面就会返回错误。
1.2.2.HTTPError
是urlerror的子类,专门处理http请求错误,比如认证请求失败等。具有三个属性:
code:返回http状态码,比如404表示网页不存在,500表示服务器内部错误
reason:返回错误的原因
headers:返回请求头
一般在一个完整的爬虫体系中,我们通常需要精准的捕获异常,来做出更确切的异常判断。
一般使用的就是try except方法
1.3 解析链接
1.3.1urlparse()
实现URL的识别的分段,代码如下:
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result)
输出为:
<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
观察一下url: http://www.baidu.com/index.html;user?id=5#comment
urlparse方法将它分为了6个部分,://前面的就是scheme,代表协议;第一个/符号前面便是netloc,即域名,后面是path,即访问路径;分号;后面是params,代表参数;后面?后面是查询条件query,一般用作GET类型的URL;井号#后面是锚点,用于直接定位页面内部的下拉位置。
所以可以得到一个标准的链接格式,如下:
scheme://netloc/path;params?query#fragment
一个标准的url都会符合这个规则,urlparse方法总共有3个参数。
urlstring:必填项,就是待解析的url
scheme:他是默认的协议,就是加入这个链接没有携带协议信息,会将这个作为默认的协议(https/http)
allow_fragments:是否忽略fragment部分,如果设置为False,fragment部分会被忽略,会被解析为path,parameters或者query的一部分,而fragment部分为空
而且返回的结果ParseResult实际上是一个元组,我们可以用索引顺序来获取,例子:result[0]
1.3.2.urlunparse()
urlparse是将url拆解,那么urlunparse()是给予部分来实现url的构造
用一个实例来看看:
from urllib.parse import urlunparse
data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
运行结果为:
http://www.baidu.com/index.html;user?a=6#comment
1.3.3.urlsplit()
这个方法和urparse()方法相似
from urllib.parse import urlsplit
result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)
运行结果为:
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
结果也是元组类型,可以用属性获取,也可以用索引获取
1.3.4.urlunsplit()
from urllib.parse import urlunsplit
data = ['http','www.baidu.com','index.html','a=6','comment']
print(urlunsplit(data))
运行结果为:
http://www.baidu.com/index.html?a=6#comment
1.3.5.urlencode()
这个方法非常实用,主要用来构造GET请求参数
代码如下:
from urllib.parse import urlencode
params = {
'name':'germey',
'age':22
}
base_url = 'http://www.baidu.com?'
url = base_url+urlencode(params)
print(url)
运行结果为:
http://www.baidu.com?name=germey&age=22
还有许多方法,就不再一一赘述
2.使用requests
requests相比urlib更加便捷,更加简单,而且requests的底层实现就是用的urlib,所以更重点学习requests.
2.1 基本用法
2.1.1GET请求
import requests
r = requests.get('http://httpbin.org/get')
print(r.text)
结果如下:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5fedacf9-642ca71b2509dc0e23ea38b0"
},
"origin": "117.150.208.93",
"url": "http://httpbin.org/get"
}
而如果要构造请求链接,相比urlib的方法,requests更加简单
import requests
data = {
'name':'germey',
'age':22
}
r = requests.get('http://httpbin.org/get',params=data)
print(r.text)
结果为:
{
"args": {
"age": "22",
"name": "germey"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5fedad7c-21e09169150018470f4fc74e"
},
"origin": "117.150.208.93",
"url": "http://httpbin.org/get?name=germey&age=22"
}
网页返回的类型是str类型但是确实JSON格式的,所以想直接解析结果得到一个字典的话,可以调用json()方法:
import requests
r = requests.get('http://httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))
结果为:
<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5fedae12-293c4e364a0ce5d136419671'}, 'origin': '117.150.208.93', 'url': 'http://httpbin.org/get'}
<class 'dict'>
json()方法可以将json格式的字符串转化为字典
如果我们需要抓取一个网页,那么我们需要添加更多的参数
import requests
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}
r = requests.get('https://www.zhihu.com/explore',headers=headers)
print(r.text)
我们这里添加了headers信息,即浏览器标识信息。
抓取二进制数据(如图片)
import requests
r= requests.get('https://github.com/favicon.ico')
print(r.text)
print(r.content)
这样获取返回的会是乱码:
:�������O L������ ������ ������! ������4 @���8���
��������333 ���t�������+R������t `������R���������� �������������\ G������������ ������������ ������������ ��������������� ������������% ������������v a������G������ ������G+++������] I������+++ ������3 ������ �����5 +*��� ���& !����� �����f @@@b����������l+++ R����� $$$��������������������������$$$ ������������������������ .����������������������. �������������������� $$$������������������$$$ �������������� +++G��������G+++
b'\x00\x00\x01\x00\x02\x00\x10\x10\x00\x00\x01\x00 \x00(\x05\x00\x00&\x00\x00\x00 \x00\x00\x01\x00 \x00(\x14\x00\x00N\x05\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00...'
那么我们采取什么方式来获取呢?
import requests
r= requests.get('https://github.com/favicon.ico')
with open('favicon.ico','wb') as f:
f.write(r.content)
使用 with open的方法,第一个参数是文件名,第二个参数是代表以二进制写的形式打开
这样就会在同级目录下出现一个文件,打开就是一个图片
2.1.2 POST请求
也很简单:
import requests
data = {'name':'germey','age':22}
r= requests.post('http://httpbin.org/post',data=data)
print(r.text)
运行结果如下:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "22",
"name": "germey"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "18",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5fedb265-128a28f52e746a9062e4e6ac"
},
"json": null,
"origin": "117.150.208.93",
"url": "http://httpbin.org/post"
}
2.1.3 响应
发送请求后,获取的是响应,我们可以使用text,content获取,还有很多属性和方法是可以来获取其他信息的比如状态码,响应头,Cookies等等
import requests
# 查看响应内容,response.text 返回的是str类型
print(response.text)
# 查看响应内容,response.content返回的字节流数据
print(respones.content)
# 查看响应的url地址
print(response.url)
# 查看响应头部字符编码
print(response.encoding)
# 查看响应状态码
print(response.status_code)
状态码判断可参考:
https://blog.csdn.net/qq_37555524/article/details/100364405?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160941341616780274042322%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=160941341616780274042322&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-100364405.first_rank_v2_pc_rank_v29&utm_term=%E7%BD%91%E9%A1%B5%E7%8A%B6%E6%80%81%E7%A0%81
2.2高级用法
2.2.1文件的上传
加入有的网站需要上传文件,我们可以用files来实现
import requests
files = {'file':open('favicon.ico','rb')}
r= requests.post('http://httpbin.org/post',files=files)
print(r.text)
返回结果为:
{
"args": {},
"data": "",
"files": {
"file": "data:application/octet-stream;base64,AAABAAIAEBAAAAEAIAAoBQAAJgAAA...="
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "6665",
"Content-Type": "multipart/form-data; boundary=e6d54847bac41a76f9c95495964b72c7",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5fedb3f3-6cfd8d11660970af0c9bff02"
},
"json": null,
"origin": "117.150.208.93",
"url": "http://httpbin.org/post"
}
2.2.2Cookies
import requests
r= requests.get('https://www.baidu.com')
print(r.cookies)
for key,value in r.cookies.items():
print(key + '=' + value)
结果为:
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315
首先调用cookies属性获取Cookies,然后他是一个RequestsCookieJar类型。然后用items方法转化为元组组成的列表。遍历每个cookie实现遍历解析
当然我们也可以直接在界面复制cookie来维持登陆状态,比如
import requests
headers = {
'Cookie': '_zap=d517e5be-3ce4-4885-b0b2-fa3c78fec390; d_c0="AFCWZnmbRxKPTjEb8AmKToWijlCvbhvo9aE=|1606823131"; _xsrf=2d620a42-4ea0-46fa-97df-9cd3b8959c7b; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1607217795,1607254047,1607427553,1609412423; SESSIONID=b9wEktq43Q4QnYcvJzCdjUrcJcLMVYVISEKswEfFwok; JOID=UFoXB0_go47MPylXE-ZlksNCtBYBgpr_iVJdJiHV8rqbUXY0ZagKZZU5KVEV4vKGdnRAtshFgAbeSU8s7Y9FNas=; osd=UloQB0nio4nMOStXFOZjkMNFtBADgp3_j1BdISHT8LqcUXA2Za8KY5c5LlET4PKBdnJCts9FhgTeTk8q749CNa0=; capsion_ticket="2|1:0|10:1609413981|14:capsion_ticket|44:YjY3YjUxYzAyZDYxNGE0ZDliYWIxZjdmOTNkZjliMDk=|7bf031b23c07d41d7300db4b24331a11bfddc0ac59313c47b8aaca5230439181"; z_c0="2|1:0|10:1609414006|4:z_c0|92:Mi4xbnFzTklRQUFBQUFBVUpabWVadEhFaVlBQUFCZ0FsVk5kZ1BiWUFCWFVRNGVielBNR1g2TGRycFM1dHYxamVsZXVB|8207a2b80acad856267acb964018bf2080a2c08a0673fd0eb0b5b4369bcf4eaa"; unlock_ticket="ABAfn1IDNBImAAAAYAJVTX687V_qgi-HfoeKiXhq7YvrvCBjFW8UJg=="; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1609414013; KLBRSID=ca494ee5d16b14b649673c122ff27291|1609414014|1609412422',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}
r= requests.get('https://www.baidu.com',headers=headers)
print(r.text)
直接将你登陆之后的cookie复制下来,直接加入headers参数中,就可以正常登陆知乎
2.2.3会话维持
添加cookie信息可以完成登录操作,那么怎样维持这个登陆状态呢?
import requests
session = requests.Session()
r = session.get('http://httpbin.org/cookies')
print(r.text)
session实例在请求一个网站之后,对方服务器设置在本地的cookie会保存在session中,下一次在使用session请求对方服务器的时候,会带上前一次的cookie。这里使用session获取 requests.Session()方法,这样可以让后面的书写方便一些。
案例:(登陆人人网)
import requests
# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()
# 2. 处理 headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# 3. 需要登录的用户名和密码
data = {"email":"youremail", "password":"yourpassword"}
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/410043129/profile")
# 6. 打印响应内容
print(response.text)
2.2.4ssl证书验证
一般我们是禁止证书验证,设定verify参数即可
response = requests.get(url,verify=False)
2.2.5代理的设置
这是爬虫必定会用到的部分,方法为:
import requests
proxies = {
'http':'http://127.0.0.1:1111'
'https':'https://127.0.0.1:1112'
}
requests.get(url,proxies=proxies)
2.2.6超时设置
用于规定经过多长时间还未获取响应的话,就返回错误
import requests
requests.get(url,timeout=1)
时间可以自己设置,或者不加参数
2.2.7身份认证
有的网页一进去就需要身份验证,一般就是登陆认证
import requests
r = requests.get('http://localhost:5000',auth=('username','password'))
print(r.status_code)
auth后面携带你的用户名和密码
3.requests_html库
3.1请求参数
# 1.导包
from requests_html import HTMLSession
# 2.实例化(注意,要加上括号)
session = HTMLSession()
# 3.准备start_url
url = 'https://www.baidu.com'
# 4.发送请求(get)
response_get = session.get(url)
# post请求
response_post = session.post(url, data=data)
# request(请求选择化)
response = session.request(method='get'/'post', url=url)
3.2response的属性
获取源码的方法
# 1.导包
from requests_html import HTMLSession
# 2.实例化(注意,要加上括号)
session = HTMLSession()
# 3.准备start_url
url = 'https://www.baidu.com'
# 4.发送请求(get)
response_get = session.get(url)
# 5.获取html源码
html_str = response_get.html.html
print(html_str)
3.3response的对象属性
3.4response与Xpath语法
# 1.导包
from requests_html import HTMLSession
# 2.实例化(注意,要加上括号)
session = HTMLSession()
# 3.准备start_url
url = 'https://www.baidu.com'
# 4.发送请求(get)
response_get = session.get(url)
# 5.获取html源码
html_str = response_get.html.html
print(html_str)
# 6.使用xpath语法
data = response_get.html.xpath('xpath语法')
print(data)
4.案例操作(爬取猫眼电影排行)
import requests
from lxml import etree
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
'Cookie': '__mta=141860109.1609416427681.1609416512667.1609418131742.6; uuid_n_v=v1; uuid=F2EBEFF0428E11EBB1AF0F1DB9BFAA15CB5575A235BA430F8B3B568DD758C655; _lxsdk_cuid=1767ee55dc1c8-0723dd96fa7f05-594a2011-1fa400-1767ee55dc1c8; _lxsdk=F2EBEFF0428E11EBB1AF0F1DB9BFAA15CB5575A235BA430F8B3B568DD758C655; _csrf=1dee000e14ef35969dc14838269822aa885606a54f5efe06c32dd954decc8b8b; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1608446730,1609416427; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1609418132; _lxsdk_s=176b8b1c836-b48-ce1-ee2%7C%7C12'}
r = requests.get('https://maoyan.com/board/4',headers=headers)
text = r.text
# print(text)
html = etree.HTML(text)
# print(html)
ret_list = html.xpath('//*[@id="app"]/div/div/div[1]/dl/dd/div/div/div/p/a/@title')
print(ret_list)
这里仅爬取第一页,也只有电影名字,所以没有用类方法,etree.HTML()方法是将字符串转化为element对象,让xpath可以解析
5.总结
初衷是用于日后知识点忘记了来记忆的,若对您起到帮助也是极好