前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python scrapy爬取HBS 汉

python scrapy爬取HBS 汉

作者头像
py3study
发布于 2020-01-22 04:33:31
发布于 2020-01-22 04:33:31
59400
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

下面分享个scrapy的例子

利用scrapy爬取HBS 船公司柜号信息

1、前期准备

查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询

https://www.hamburgsud-line.com/liner/en/liner_services/ecommerce/track_trace/index.html

 通过浏览器的network,我们可以看到,请求的是如下的网址

 请求的参数如下,可以看到其中一些参数是固定的,一些是变化的(下图红框中的数据),而这些变化的参数大部分是在页面上,我们可以先请求一下这个页面,获取其中提交的参数,然后再提交

2编写爬虫

 2.1首先,我们请求一下这个页面,然后获取其中的一些变化的参数,把获取到的参数组合起来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request, FormRequest

class HbsSpider(scrapy.Spider):
    name = "hbs"
    allowed_domains = ["www.hamburgsud-line.com"]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def start_requests(self):
        yield Request(self.post_url, callback=self.post)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def post(self, response):
        sel = response.css('input')
        keys = sel.xpath('./@name').extract()
        values = sel.xpath('./@value').extract()
        inputData = dict(zip(keys, values))

2.2 再次请求数据

1、把固定不变的参数和页面获取到的参数一起提交

2、再把header伪装一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    post_url = 'https://www.hamburgsud-line.com/linerportal/pages/hsdg/tnt.xhtml'
def post(self, response):
        sel = response.css('input')
        keys = sel.xpath('./@name').extract()
        values = sel.xpath('./@value').extract()
        inputData = dict(zip(keys, values))
        # 提交页面的解析函数,构造FormRequest对象提交表单

       
        fd = {'javax.faces.partial.ajax': 'true',
                  'javax.faces.source': 'j_idt6:searchForm:j_idt8:search-submit',
                  'javax.faces.partial.execute': 'j_idt6:searchForm',
                  'javax.faces.partial.render': 'j_idt6:searchForm',
                  'j_idt6:searchForm:j_idt8:search-submit': 'j_idt6:searchForm:j_idt8:search-submit',
                  # 'j_idt6:searchForm': 'j_idt6:searchForm',
                  'j_idt6:searchForm:j_idt8:inputReferences': self.blNo,
                  # 'j_idt6:searchForm:j_idt8:inputDateFrom_input': '04-Jan-2019',
                  # 'j_idt6:searchForm:j_idt8:inputDateTo_input': '16-Mar-2019',
                  # 'javax.faces.ViewState': '-2735644008488912659:3520516384583764336'
                  }       

        fd.update(inputData)

        headers = {
            ':authority': 'www.hamburgsud-line.com',
            ':method': 'POST',
            ':path': '/linerportal/pages/hsdg/tnt.xhtml',
            ':scheme':'https',
            # 'accept': 'application/xml,text/xml,*/*;q=0.01',
            # 'accept-language':'zh-CN,zh;q=0.8',
            'content-type':'application/x-www-form-urlencoded; charset=UTF-8',
            'faces-request': 'partial/ajax',
            'origin':'https://www.hamburgsud-line.com',
            'referer':'https://www.hamburgsud-line.com/linerportal/pages/hsdg/tnt.xhtml',
            'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
            'x-requested-with':'XMLHttpRequest'
        }

        yield FormRequest.from_response(response, formdata=fd,callback=self.parse_post,headers=headers)

3、解析数据

3.1我们可以看到返回的数据是在XML的CDATA下,第一步,我们从中先把这个form获取出来,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def parse_post(self, response):
        # 提交成功后,继续爬取start_urls 中的页面
        text = response.text;
        xml_data = minidom.parseString(text).getElementsByTagName('update')
        if len(xml_data) > 0:
            # form = xml_data[0].textContent
            form = xml_data[0].firstChild.wholeText

3.2我们定位到柜的元素里面,因为经常一个提单下会有很多柜,如果直接用网站自动生成的id号去查找,后面用其他的提单号去爬取的时候,解析可能就有问题了

所以我们不用id去定位,改为其他方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
selector = Selector(text=form)
            trs = selector.css("table[role=grid] tbody tr")
            for i in range(len(trs)):
                print(trs[i])
                td = trs[i].css("td:nth-child(2)>a::text")
                yield  {
                    'containerNo' : td.extract()
                }

4、运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>scrapy crawl hbs -o hbs.json

可以看到,爬取到的数据如下

PS:记得把设置里面的ROBOT协议改成False,否则可能失败

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ROBOTSTXT_OBEY = False

5.代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request, FormRequest
from xml.dom import minidom
from scrapy.selector import Selector

class HbsSpider(scrapy.Spider):
    name = "hbs"
    allowed_domains = ["www.hamburgsud-line.com"]
    #start_urls = ['https://www.hamburgsud-line.com/linerportal/pages/hsdg/tnt.xhtml']

    def __init__(self, blNo='SUDU48AKL0271001', *args, **kwargs):
        self.blNo = blNo

    # ----------------------------提交---------------------------------
    # 提交页面的url
    post_url = 'https://www.hamburgsud-line.com/linerportal/pages/hsdg/tnt.xhtml'

    def start_requests(self):
        yield Request(self.post_url, callback=self.post)


    def post(self, response):
        sel = response.css('input')
        keys = sel.xpath('./@name').extract()
        values = sel.xpath('./@value').extract()
        inputData = dict(zip(keys, values))
        # 提交页面的解析函数,构造FormRequest对象提交表单

        if "j_idt6:searchForm" in inputData:
            fd = {'javax.faces.partial.ajax': 'true',
                  'javax.faces.source': 'j_idt6:searchForm:j_idt8:search-submit',
                  'javax.faces.partial.execute': 'j_idt6:searchForm',
                  'javax.faces.partial.render': 'j_idt6:searchForm',
                  'j_idt6:searchForm:j_idt8:search-submit': 'j_idt6:searchForm:j_idt8:search-submit',
                  # 'j_idt6:searchForm': 'j_idt6:searchForm',
                  'j_idt6:searchForm:j_idt8:inputReferences': self.blNo,
                  # 'j_idt6:searchForm:j_idt8:inputDateFrom_input': '04-Jan-2019',
                  # 'j_idt6:searchForm:j_idt8:inputDateTo_input': '16-Mar-2019',
                  # 'javax.faces.ViewState': '-2735644008488912659:3520516384583764336'
                  }
        else:
            fd = {'javax.faces.partial.ajax': 'true',
                  'javax.faces.source': 'j_idt7:searchForm: j_idt9:search - submit',
                  'javax.faces.partial.execute': 'j_idt7:searchForm',
                  'javax.faces.partial.render': 'j_idt7:searchForm',
                  'j_idt7:searchForm:j_idt9:search-submit': 'j_idt7:searchForm:j_idt9:search-submit',
                  # 'javax.faces.ViewState:': '-1349351850393148019:-4619609355387768827',
                  # 'j_idt7:searchForm:': 'j_idt7:searchForm',
                  # 'j_idt7:searchForm:j_idt9:inputDateFrom_input':'13-Dec-2018',
                  # 'j_idt7:searchForm:j_idt9:inputDateTo_input':'22-Feb-2019',
                  'j_idt7:searchForm:j_idt9:inputReferences': self.blNo
                  }

        fd.update(inputData)

        headers = {
            ':authority': 'www.hamburgsud-line.com',
            ':method': 'POST',
            ':path': '/linerportal/pages/hsdg/tnt.xhtml',
            ':scheme':'https',
            # 'accept': 'application/xml,text/xml,*/*;q=0.01',
            # 'accept-language':'zh-CN,zh;q=0.8',
            'content-type':'application/x-www-form-urlencoded; charset=UTF-8',
            'faces-request': 'partial/ajax',
            'origin':'https://www.hamburgsud-line.com',
            'referer':'https://www.hamburgsud-line.com/linerportal/pages/hsdg/tnt.xhtml',
            'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
            'x-requested-with':'XMLHttpRequest'
        }

        yield FormRequest.from_response(response, formdata=fd,callback=self.parse_post,headers=headers)

    def parse_post(self, response):
        # 提交成功后,继续爬取start_urls 中的页面
        text = response.text;
        xml_data = minidom.parseString(text).getElementsByTagName('update')
        if len(xml_data) > 0:
            # form = xml_data[0].textContent
            form = xml_data[0].firstChild.wholeText

            selector = Selector(text=form)
            trs = selector.css("table[role=grid] tbody tr")
            for i in range(len(trs)):
                print(trs[i])
                td = trs[i].css("td:nth-child(2)>a::text")
                yield  {
                    'containerNo' : td.extract()
                }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战 | 如何使用微信云托管快速部署后端服务
微信云托管是为开发者提供的云原生全托管的容器后端云服务,控制台界面简洁,操作便捷,并且为开发者首个环境赠送1个月的免费额度,果断创建环境来试一试。
腾讯云开发TCB
2021/08/13
6.2K0
实战 | 如何使用微信云托管快速部署后端服务
直播预约:微信云托管「云调用」能力使用指南
微信云托管 是由微信团队联合腾讯云推出的一站式后端云服务。对于应用开发采用前后端分离架构的场景,云托管可做到 免运维免域名、免服务器管理、防 DDoS 攻击和 境外加速 等,从代码管理到 CI/CD 流水线部署发布,提供全链路、低成本、企业级的云原生解决方案。
腾讯云开发TCB
2021/10/26
7770
直播预约:微信云托管「云调用」能力使用指南
直播即将开启:小程序云开发技术峰会
地址:https://cloud.tencent.com/developer/salon/salon-1281
腾讯云开发TCB
2020/11/30
1.4K0
直播即将开启:小程序云开发技术峰会
直播预约:云托管 or 云函数,业务如何做好技术选型?
本期微信云托管「从入门到精通」系列直播将详细对比和分析云托管和云函数技术,并解答开发者关心的常见问题。
腾讯云开发TCB
2021/10/13
6130
直播预约:云托管 or 云函数,业务如何做好技术选型?
正在直播:微信云托管「云调用」功能详解
微信云托管 是由微信团队联合腾讯云推出的一站式后端云服务。对于应用开发采用前后端分离架构的场景,云托管可做到免运维免域名、免服务器管理、防 DDoS 攻击和境外加速等,从代码管理到 CI/CD 流水线部署发布,提供全链路、低成本、企业级的云原生解决方案。
腾讯云开发TCB
2021/11/01
2.1K0
正在直播:微信云托管「云调用」功能详解
正在直播:当 DevOps 遇上云托管,还有云托管“一日产品经理”体验!
云计算走过十余载,正影响着近一代技术人的研发生产习惯,在此期间,不断有新的技术概念涌现,也有经典理论、框架历久弥新。当我们把目光拉近,技术的快速发展到底给程序员带来了哪些改变,云的出现又为业务带来了哪些“肉眼可见”的价值?关于这些命题,我们想和你一起聊聊。
腾讯云开发TCB
2022/03/25
8420
正在直播:当 DevOps 遇上云托管,还有云托管“一日产品经理”体验!
微信云托管如何实现一套代码对应多个环境
微信云托管 是由微信团队联合腾讯云推出的一站式后端云服务。对于应用开发采用前后端分离架构的场景,云托管可做到免运维免域名、免服务器管理、防 DDoS 攻击和境外加速等,从代码管理到 CI/CD 流水线部署发布,提供全链路、低成本、企业级的云原生解决方案。
腾讯云开发TCB
2021/10/12
1K0
微信云托管如何实现一套代码对应多个环境
当 DevOps 遇上云托管:依力云托管TalkShow第三期预约中
云计算走过十余载,正影响着近一代技术人的研发生产习惯,在此期间,不断有新的技术概念涌现,也有经典理论、框架历久弥新。当我们把目光拉近,技术的快速发展到底给程序员带来了哪些改变,云的出现又为业务带来了哪些“肉眼可见”的价值?关于这些命题,我们想和你一起聊聊。 每周四晚八点一刻,来程序员自己的技术脱口秀——“依力Talk Show”,一期一个技术话题,拥有十年互联网项目经验的老程序员依力将从项目实践角度,分享技术干货,和你一起畅聊技术。 第三期 DevOps 遇上云托管 直播时间 3月24日(周四) 20
腾讯云开发TCB
2022/03/24
8790
直播预约中:十年项目交付辛酸泪,从部署文档到 Docker
云计算走过十余载,正影响着近一代技术人的研发生产习惯,在此期间,不断有新的技术概念涌现,也有经典理论、框架历久弥新。当我们把目光拉近,技术的快速发展到底给程序员带来了哪些改变,云的出现又为业务带来了哪些“肉眼可见”的价值?关于这些命题,我们想和你一起聊聊。
腾讯云开发TCB
2022/03/10
3830
直播预约中:十年项目交付辛酸泪,从部署文档到 Docker
每周聊点技术干货,程序猿依力 X 云托管系列直播来了!
云计算走过十余载,正影响着近一代技术人的研发生产习惯,在此期间,不断有新的技术概念涌现,也有经典理论、框架历久弥新。当我们把目光拉近,技术的快速发展到底给程序员带来了哪些改变,云的出现又为业务带来了哪些“肉眼可见”的价值?关于这些命题,我们想和你一起聊聊。
腾讯云开发TCB
2022/03/10
7640
每周聊点技术干货,程序猿依力 X 云托管系列直播来了!
聊聊「鉴权」那些事,依力云托管TalkShow第二期来了
云计算走过十余载,正影响着近一代技术人的研发生产习惯,在此期间,不断有新的技术概念涌现,也有经典理论、框架历久弥新。当我们把目光拉近,技术的快速发展到底给程序员带来了哪些改变,云的出现又为业务带来了哪些“肉眼可见”的价值?关于这些命题,我们想和你一起聊聊。
腾讯云开发TCB
2022/03/17
4610
聊聊「鉴权」那些事,依力云托管TalkShow第二期来了
微信云托管资源包与技术支持能力发布
微信云托管已正式推出资源包,业务选择更加灵活,使用微信云托管,全程可获得1v1技术支持,更有企业激励计划,提供万元补贴、专家迁移服务等。
腾讯云开发TCB
2021/08/16
1.1K0
微信云托管资源包与技术支持能力发布
Serverless“七年不痒”:迈向云托管的下一站!
引言 点击视频链接观看会议精彩集锦 http://mpvideo.qpic.cn/0bc32qaamaaaf4aguoxsubqvbvgda3kaabqa.f10002.mp4? 云计算的出现彻底地改
TVP官方团队
2022/04/08
8940
Serverless“七年不痒”:迈向云托管的下一站!
微信云托管热点问题Q&A
微信云托管是由微信团队联合腾讯云推出的后端项目全托管服务。对于微信生态应用开发采用前后端分离架构的场景,云托管可做到免运维免服务器管理,从代码管理到CI/CD流水线部署发布,提供全链路、低成本、企业级的云原生解决方案。
腾讯云开发TCB
2021/06/29
7100
微信云托管热点问题Q&A
微信云托管启动公测:宣讲会预约中
【微信云托管】正式开启公测!前后端分离、serverless免运维、高可用…企业级的后端项目全托管服务来了!想知道云托管有哪些重磅能力更新?与云开发的区别在哪里?跟传统服务器相比又有什么优势?欢迎扫码二维码,预约6.28晚上8点的线上宣讲会,我们会全面介绍微信云托管。
腾讯云开发TCB
2021/06/21
1.6K0
微信云托管启动公测:宣讲会预约中
微信云托管已支持自定义域名和一键部署
微信云托管 是由微信团队联合腾讯云推出的一站式后端云服务。对于应用开发采用前后端分离架构的场景,云托管可做到免运维免域名、免服务器管理、防 DDoS 攻击和境外加速等,从代码管理到 CI/CD 流水线部署发布,提供全链路、低成本、企业级的云原生解决方案。
腾讯云开发TCB
2021/08/23
4.4K4
微信云托管已支持自定义域名和一键部署
「一文读懂」微信云托管
微信云托管是微信团队联合腾讯云推出的后端项目全托管服务。对于微信生态应用开发采用前后端分离架构的场景,云托管可做到免运维免服务器管理,从代码管理到CI/CD流水线部署发布,提供全链路、低成本、企业级的云原生解决方案。
腾讯云开发TCB
2021/07/05
4.7K0
「一文读懂」微信云托管
直播预约:依力云托管 TalkShow 微信支付专场
云计算走过十余载,正影响着近一代技术人的研发生产习惯,在此期间,不断有新的技术概念涌现,也有经典理论、框架历久弥新。当我们把目光拉近,技术的快速发展到底给程序员带来了哪些改变,云的出现又为业务带来了哪些“肉眼可见”的价值?关于这些命题,我们想和你一起聊聊。 每周四晚八点一刻,来程序员自己的技术脱口秀——“依力Talk Show”,一期一个技术话题,拥有十年互联网项目经验的老程序员依力将从项目实践角度,分享技术干货,和你一起畅聊技术。 第四期 「微信支付」专场 直播时间 3月31日(周四) 20:15
腾讯云开发TCB
2022/03/31
8060
直播预约:依力云托管 TalkShow 微信支付专场
正在直播:十年项目交付辛酸泪,从部署文档到 Docker
依力,独立开发者,前 EduSoho 大移动端研发负责人、近10年全栈开发、架构设计和项目交付经验。熟练掌握 Java、PHP、JavaScript 等编程语言。具有丰富的敏捷研发管理经验。目前通过“程序猿依力”视频号进行全栈开发实战直播。曾通过微信云开发30天直播完成一个完整小程序案例。
腾讯云开发TCB
2022/03/14
3500
正在直播:十年项目交付辛酸泪,从部署文档到 Docker
小城里的“明星”产业,有微信云托管保驾护航
地处河南省最南端的信阳市是一座拥有600多万常住人口的中小型城市,四季分明,气候适宜,有“江南北国、北国江南”之美誉。信阳当地拥有众多娱乐设施,但其中有一个比较特别,那就是属于当地人的“限定快乐”——信阳海岛风暴水上乐园(下称“水上乐园”)。
腾讯云开发TCB
2021/12/20
5000
小城里的“明星”产业,有微信云托管保驾护航
推荐阅读
相关推荐
实战 | 如何使用微信云托管快速部署后端服务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验