下面分享个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 scrapy
from 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)
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()
}
0