下面分享个scrapy的例子

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

1、前期准备

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

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

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

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

2编写爬虫

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

# -*- coding: utf-8 -*-import scrapyfrom scrapy.http import Request, FormRequest

class HbsSpider(scrapy.Spider):    name = "hbs"    allowed_domains = ["www.hamburgsud-line.com"]
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))

2.2 再次请求数据

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

2、再把header伪装一下

    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获取出来,

    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].textContentform = xml_data[0].firstChild.wholeText

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

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

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、运行

>scrapy crawl hbs -o hbs.json

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

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

ROBOTSTXT_OBEY = False

5.代码

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request, FormRequest
from xml.dom import minidom
from scrapy.selector import Selectorclass 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# ----------------------------提交---------------------------------# 提交页面的urlpost_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].textContentform = xml_data[0].firstChild.wholeTextselector = 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()}

转载于:https://www.cnblogs.com/francisfan/p/10485005.html

python scrapy爬取HBS 汉堡南美航运公司柜号信息相关推荐

  1. python scrapy爬取智联招聘的公司和职位信息(一)

    这个帖子先暂时放弃.本以为和拉钩一样全是静态页面,结果在写item的时候,发现网页有点意思,突然有个大胆的想法,想试试-先埋坑,后面在填坑 缘由: 最近在找工作发现智联和51上太多培训机构的虚假招聘信 ...

  2. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  3. Python+scrapy爬取36氪网

    Python+Scrapy爬取36氪网新闻 一.准备工作: ​ ①安装python3 ​ ②安装scrapy ​ ③安装docker,用来运行splash,splash是用来提供js渲染服务(pyth ...

  4. 如何用 Python + Scrapy 爬取视频?

    今天将带大家简单了解Scrapy爬虫框架,并用一个真实案例来演示代码的编写和爬取过程. 一.scrapy简介 1. 什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...

  5. 手把手教你使用Python+scrapy爬取山东各城市天气预报

    1.在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社区小说"大宗师"全文 2.使用 ...

  6. Scrapy 爬取80s电影网高评分电影详细信息(Scrapy)

    看到一个帖子说用scrapy爬取不了 https://blog.csdn.net/qq_15065903/article/details/99778873 我就想试试看看: 用了一下链接提取器: mo ...

  7. python Scrapy爬取天气预报,零基础的你也可以快速上手

    目的 写一个真正意义上一个爬虫,并将他爬取到的数据分别保存到txt.json.已经存在的mysql数据库中. 目标分析: 初学者有什么不懂的可以私信我--我刚整理了一套2021最新的0基础入门教程,无 ...

  8. 使用python scrapy爬取全国小区信息(包括小区价格,经纬度,面积,户数等),并保存到mysql和excel

    目标 此次爬取的网站是楼盘网,因为只爬取小区信息,所以先从深圳小区(http://sz.loupan.com/community/)网页入手分析,然后发散爬取至全国. 爬取的信息包括 省,所属市,所属 ...

  9. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己

    本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...

最新文章

  1. 【深度学习】(2) 数据加载,前向传播2,附python完整代码
  2. OFBiz + Opentaps 仓储设施 基本管理
  3. 我们不要框计算 我们要更好的搜索体验
  4. 微信支付教程系列之公众号支付
  5. 统计学习II.7 广义线性模型1 指数分布族
  6. 用数学方法构造神经网路的迭代次数1-9
  7. Oracle 块修改跟踪 (Block Change Tracking) 说明
  8. 使用Injection Token将字符串类型的参数注入到类的构造函数里
  9. 如何进行聚类可视化_如何使用matplotlib包进行数据可视化
  10. zookeeper安装和使用 windows环境
  11. 漫话:为什么计算机起始时间是1970年1月1日?
  12. Oracle性能调优方法
  13. 2021年下半年网络工程师下午真题及答案解析
  14. 赋值运算符(AssignmentOperator)
  15. 模板题——容斥原理、博弈论
  16. UG NX 12 草图尺寸小数点怎么更改?
  17. python基础(一):入门必备知识
  18. 使用Matlab绘制LFP锂离子扩散动态示意图
  19. web端实现类微信的语音播放效果
  20. dw做注册登录页面HTML代码,用DW做的简单的个人网站(可以用来当网页作业)

热门文章

  1. openCV study-Module1_图像处理基础
  2. jquery怎么实现点击刷新当前页面
  3. 上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5个区域,请编写程序从键盘输入邮件的目的区域编码和重量,按下列计费规则计算快递费用并输出运费,计算结果保留2位小数。
  4. 【bzoj3252】攻略
  5. Android开发实战《手机安全卫士》——10.“进程管理”模块实现 PopupWindow 内存清理
  6. 关于在经济欠发达地区建设简易教育城域网的提案
  7. VB编程:DoWhile...Loop当循环计算0~100累加和-15
  8. 黑马程序员-Java高新技术-反射
  9. 为什么要报考消防工程师?消防工程师证书有什么用呢?
  10. iDownsV1.8.4资源素材教程下载类WordPress