CSS偏移反爬虫

我们的目标url:http://www.porters.vip/confusion/flight.html

这次和以往遇到的不一样,我们爬取到的价格和页面显示的并不一样,经过分析,可以看到原来的位置边上还有多余的几个数字,其实这些都是要覆盖在原来数字上的。画个简图:

明白原理之后,我们爬取时,就要将多余的这些数字也要爬取下来,包括style的偏移属性。然后根据属性的位置除以16,结果当作原来列表的索引替换就好了。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests, re
from lxml import etree
def crawler():
    url = 'http://www.porters.vip/confusion/flight.html'
    response = requests.get(url)
    # xpath
    html_ele = etree.HTML(response.text)
    flight_list = html_ele.xpath('//div[@class="e-airfly"]')
    # 以每条航班信息为单位组成的列表
    for flight in flight_list:
        # 在每条信息的基础上,再次使用xpath匹配对应内容
        print('航班信息:', flight.xpath('div/div/span/text()')[0], end=' ')
        # 起点
        start = flight.xpath('div[2]/div/h2/text()')[0]
        # 终点
        end = flight.xpath('div[2]/div/h2/text()')[-1]
        print(start, '->', end, end='  ')
        # 币种 ¥
        Currency = flight.xpath('div/p/i/text()')[0]
        print(Currency, end='')
        # 基础价格
        base_price = flight.xpath('div/p/span/span/em/b/i/text()')
        # 偏移价格
        offset_price = flight.xpath('div/p/span/span/em/b[position()>1]/text()')
        # 偏移的索引号
        offset_index = flight.xpath('div/p/span/span/em/b[position()>1]/@style')
        num = 0
        # 遍历出所有要替换的style,将其除以16px,然后得到的相当于索引号了
        for _ in offset_index:
            offset = re.findall('width: 16px;left:(.*?)px', _)[0]
            position = int(offset) / 16
            if abs(int(position)) <= len(base_price):
                # 根据索引号替换原列表位置
                base_price[int(position)] = offset_price[num]
            else:
                print(position)
            num += 1
        print(''.join(base_price))
if __name__ == '__main__':
    crawler()

版权声明:
作者:hyzsj0106
链接:https://www.cxywy.com/?p=351
来源:程序员无垠
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>