笔者以爬取2018年AAAI人工智能顶会论文元数据为例。其中包括标题(title)和摘要(abstract)等字段
前言:
首先需要查看该网页是否可以爬取,通过在URL后加入/robots,txt
可以查看。
①tbody
问题
URL:2018AAAI的第一篇论文元数据页面 页面如下:
笔者通过谷歌浏览器选取上图红框内容的xpath如下:
from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)
返回结果是一个空列表
经查询得知原因是:浏览器会对html文本进行一定的规范化,所以会自动在路径中加入tbody
,导致读取失败,在此处直接在路径中去除tbody
即可。
正确xpath:
data = etree.HTML(html).xpath('//*[@id="content"]/table/tr[4]/td[4]/text()')
②URL问题
URL:2018AAAI的第一篇论文页面
笔者通过谷歌浏览器选取上图红框内容的xpath如下:
from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
response = requests.get(url)
xml = response.content
data = etree.HTML(xml).xpath('//*[@id="abstract"]/div/text()')
返回结果是一个空列表
1.首先查看是否成功获取了XML
可见成功获取了xml
,说明请求服务器成功获得响应。但仔细查看获取的xml
发现里面没有相关的摘要和作者相关信息。肯定也就无法通过xpath
获取摘要文本。逐步查看xml
发现里面有一条URL和请求的URL很相似,点进去发现两个URL是同一个页面。
发现第二个URL路径中多了一个Paper
字段。
'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/viewPaper/16065'
尝试请求第二个URL后发现返回了完整的包含网页摘要、作者标题等信息的XML
,遂成功爬取到该网页的摘要。
补充:
①建议使用requests.content
建议获取请求得到的响应用requests.content
返回二进制响应内容,使用requests.text
可能会出现编码声明不支持问题
xml = response.content
②建议加入请求头(headers)
以模拟浏览器登录
from lxml import etree
import requests
headers = {
'Cookie':'OCSSID=4df0bjva6j7ejussu8al3eqo03',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url,headers=headers)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)
获取请求头,使用谷歌浏览器可获取,一般选取User-Agent
,Cookie
等字段,使用浏览器登录某个网页时,需要向服务器端发出请求,请求头就包含自己使用的浏览器的相关信息。相关介绍见:百度百科