python爬虫——基于requests与xpath

近几日在实习过程中接触了python爬虫,在此记录一些心得与体会,也为自己做一些爬虫方面的备忘与笔记。

Requests官方文档:快速上手 — Requests 2.18.1 文档
Requests是一个对新手很是友好的库,我也将它作为我爬虫入门的首选工具。

首先导入Requests模块

import requests

我们在爬虫时为了避免被网站的防爬机制发现,我们可以通过F12可以在控制台查看浏览器访问时的header,并为我们的爬虫定制一个header
以客路网(https://www.klook.com/zh-CN/)为例:
我们往往需要User-Agent来伪装我们的爬虫

headers =  {
 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}

Requests有两种发送网络请求的方式:get与post。
一般通过F12可以在控制台查看所需爬取网页的网络请求方式
在Network下的Headers选卡很容易得知Request Method为get方式

res = requests.get(url = 'https://www.klook.com/zh-CN/', headers=headers)
print(res.text)

由此我们便可以得到网页的全部静态内容

那我们又该如何筛选出我们所需要的信息呢?
在此我选择了xpath的方式,xpath可以非常简单明确地抽取HTML中的信息

首先引入 LXML 库的 etree 模块

from lxml import etree

并利用上文得到的网页内容构造一个xpath解析的对象

html = etree.HTML(res)

接下来我们使用谷歌浏览器自带的路经查询功能,在所需爬取内容部分右击选择“检查”,便会自动定位到html中的相应位置,并继续右击选择“Copy”-“Copy Xpath”,我们便得到了此处的xpath.

我们以“热门目的地”中的“台北”为例:



根据xpath我们便可以定位“台北”的文本位置

name = html.xpath('/html/body/section[2]/div[1]/div[1]/div/div[1]/div[1]/div/a/div/div/span/b/text()')
print(name[0])

那么我们能否批量地获得其他地点的名字呢?
我们可以观察一下各个地点的xpath

台北:/html/body/section[2]/div[1]/div[1]/div/div[1]/div[1]/div/a/div/div/span/b
香港:/html/body/section[2]/div[1]/div[1]/div/div[1]/div[2]/div/a/div/div/span/b
澳门:/html/body/section[2]/div[1]/div[1]/div/div[1]/div[3]/div/a/div/div/span/b

我们很快就可以发现唯一的区别便是第五个div标签的值不同

我们可以通过一个简单的循环来获得所有的地名

for i in range(0, 8):
    name_path ='/html/body/section[2]/div[1]/div[1]/div/div[1]/div[' + str(i) + ']/div/a/div/div/span/b/text()'
    name = html.xpath(name_path)

现在我们尝试能否获取各地的图片信息
仍旧先研究台北,在定位图片在html中的位置后,我们向上寻找发现图片url在红框处,发现我们所需要的信息在"data-original"属性内,我们这时使用@来抽取标签属性

pic = html.xpath('/html/body/section[2]/div[1]/div[1]/div/div[1]/div[1]/div/@data-original')
print(pic[0])

完整代码如下

import requests
from lxml import etree

headers =  {
 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}

res = requests.get(url = 'https://www.klook.com/zh-CN/', headers=headers)
html = etree.HTML(res)

for i in range(0, 8):
    name_path = '/html/body/section[2]/div[1]/div[1]/div/div[1]/div[' + str(i) + ']/div/a/div/div/span/b/text()'
    pic_path = '/html/body/section[2]/div[1]/div[1]/div/div[1]/div[' + str(i) + ']/div/@data-original'
    name = html.xpath(name_path)
    pic = html.xpath(pic_path)
    print(name[0])
    print(pic[0])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348